美文网首页
ArrayList深度分析疑问

ArrayList深度分析疑问

作者: 琉梳 | 来源:发表于2019-02-22 21:59 被阅读0次
话不多说,直接上源码
  1. 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))
} 这种不需要遍历,直接删除

相关文章

网友评论

      本文标题:ArrayList深度分析疑问

      本文链接:https://www.haomeiwen.com/subject/epmyyqtx.html