ArrayList深度分析疑问
话不多说,直接上源码
- ArrayList的三种构造方式中
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
为什么需要定义两个功能相同的变量?
第一个变量是在指定了默认size的时候,当size为0是的初始化成一个空集合,扩容时按增长方式扩容,至于第二个变量是没有参数的构造函数调用的,目的是为了知道集合在添加元素时,需要扩容多少,第二个应该为10,加入第一个数值时才给空间
2.为什么List set操作不修改modCount值呢?
modCount 的作用是快速实现fail-fast机制来保证同步变量的,set只是改变了其中的值,而list所关心的exceptedModCount 并没有变化,所以对于值的操作无需关心,只需要关心迭代器的游标是否变化即可
3.Fail-Fast机制:
每次新建Itr()对象时,都会保存新建该对象时对应的modCount,这个值表示List当时的修改次数,但是List可能会不断修改的,modCount也在变化,所以以后每次遍历List中的元素的时候,都会比较expectedModCount和modCount是否相等。若不相等,说明List中的元素已经发生了变化,再照之前的状态遍历显然是不对的,故抛出ConcurrentModificationException异常,产生Fail-Fast事件
4.序列化:
由于 ArrayList 是基于动态数组实现的,所以并不是所有的空间都被使用。因此使用了 transient 修饰,可以防止被自动序列化。所以ArrayList自定义了序列化和反序列化的方法,只序列化被使用的数据
5.ensureCapacity:要加入大量的数据的时候,给用户调用,以减少增量从新分配的次数
6.ArrayList 中移除某个元素,如果不需要创建一个新的List怎么样效率最高
推荐用if(list.contains(object)){
list.remove(list.indexof(obejct))
} 这种不需要遍历,直接删除