ArrayList面试题
2021-02-23 00:59
776 查看
ArrayList结构
ArrayList
ArrayList继承自AbstractList抽象类,是顺序容器,即元素存储的顺序和放入的顺序一致。允许放入null元素,底层实现为Object类型数组。
扩容过程
使用默认构造函数创建ArrayList时,ArrayList中的元素数组大小默认为0.在第一次放入元素时,会进行扩容操作,将其容量扩大到10.
综上所述,ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入元素时才分配10(默认)个对象空间。
每次向容器中添加元素,都会先计算添加完元素的大小是否超出了容量,如果超出则容器会自动扩容底层Object数组的大小。
具体操作流程如下:
- 先判断数组是不是默认的空数组,如果是则将容量置为10.
- 如果数组的预期实际容量超过容量,则将容量扩充至原数组容量*1.5。如果发现原容量*1.5也小于数组的预期实际容量,则将预期实际容量作为数组的容量 举个例子,如果数组容量为10,且其中只有1个元素,此时我们使用addAll方法向其中添加20个元素,预期实际容量为21,会先将数组的容量变为10*1.5=15,发现15<21后,会将21作为数组的容量
快速失败fast-fail机制
一、快速失败(fail—fast)
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出 Concurrent Modification Exception。
原理:集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。而迭代器在初始化时,会将当时集合的modCount作为自己的modCount。迭代器在遍历时直接访问集合中的内容,并且在遍历过程中会校验modCount的值是否发生变化,会检测 modCount 变量是否为 expectedmodCount 值,是的话就返回遍历;否则抛出异常,终止遍历。
但及时如此也不能使用该机制保证ArrayList的线程安全,如果集合发生变化时修改 modCount 值刚好又设置为了 expectedmodCount 值,则异常不会抛出。
相关文章推荐
- 关于ArrayList的5道面试题
- Java面试题——ArrayList和Linked区别
- Java集合面试题(01) Java中ArrayList和Vector之间的区别
- 关于ArrayList的5道面试题
- 关于ArrayList的5道面试题
- 关于ArrayList的5道面试题
- 关于ArrayList的5道面试题
- 关于ArrayList的5道面试题
- 2019面试题:请解释ArrayList和Vector的区别?
- 一道关于:ArrayList、Vector、LinkedList的存储性能和特性 的面试题
- ArrayList和CopyOnWriteArrayList面试题总结与源码分析
- 关于ArrayList的5道面试题
- 关于ArrayList的5道面试题
- 面试题:java中ArrayList循环遍历并删除元素的陷阱
- ArrayList扩容原理——面试题
- 类集常考面试题(ArrayList、Vector、LinkedList的区别)
- 常见面试题手写ArrayList
- 关于ArrayList的5道面试题
- 关于arraylist的一些面试题
- 常见面试题之自我实现ArrayList & LinkedList