源码阅读之ArrayList实现细节

  • 时间:
  • 浏览:0

ArrayList 还可不都可不可不上能说是 Java 守护线程池池猿最为常用的你这个数据底部形态了。ArrayList 是通过数组实现的,容量还可不都可不可不上能自增的线性表。而数组的优点是计算机还可不都可不可不上能通过下标计算访问地址,已经 访问元素的波特率单位是减慢的,时间复杂化度为O(1);但数组不要擅长插入和删除操作,那先 操作的时间复杂化度是O(n)。或者 ArrayList 继承了数组那先 特点。

这是数组拷贝函数,是 native 函数,它经过虚拟机优化的,波特率单位比较高。在 ArrayList 中移动元素已经 通过你这个 土土最好的办法。

它会先把 Collection 对象通过 toArray 土土最好的办法转化为数组,或者再调用 System.arraycopy 进行数据的移动。

addAll 土土最好的办法把有还还有一个 Collection 对象添加到列表中来。

index 位置上添加有还还有一个 列表

执行流程为

remove 土土最好的办法则是通过调用内外部类的 remove 土土最好的办法来实现的。

首先检查下标否是正确,或者构造有还还有一个 SubList 对象,这是有还还有一个 内内外部类。

先把 modCount 加1,表示对该列表进行了一次操作。

当传有还还有一个 元素对象进行删除操作时,可不都可不可不上能 遍历数组,找到该元素在列表中的位置 index

遍历列表元素

或者在调用 add 土土最好的办法时,因为当前数组 elementData 的容量过低时,就会调用扩容的 grow 土土最好的办法,把数组扩大为从前的1.5倍的大小。

或者通过 fastRemove 土土最好的办法进行删除。

AbstractList 是继承于 Collection 接口。或者简单的关系图还可不都可不可不上能表达为

通过底下的 add 土土最好的办法的走读,你这个 土土最好的办法就很好理解了。

ArrayList 添加有还还有一个 元素

minCapacity 表示目前可不都可不可不上能 的容量大小。因为它大于目前 elementData 的容量大小,没有 就会执行 grow 土土最好的办法增加数组容量。

在指定的 index 位置上添加有还还有一个 元素

或者再执行 ensureExplicitCapacity 土土最好的办法。

Itr 是有还还有一个 内内外部类,实现了 Iterator 接口。

或者再空出的 numNew 位置上添加元素。

ArrayList 继承于 AbstractList 并实现了 ListRandomAccessCloneableSerializable 接口。

同样地,此土土最好的办法中因为 modCount 被异常修改了(之类在有些守护线程池池中执行了 add 土土最好的办法)没有 就会抛出 ConcurrentModificationException 异常。

以上有还还有一个 土土最好的办法中已经 需要 注意 ConcurrentModificationException 异常的处于。

该土土最好的办法的逻辑是

删除指定 index 位置上的元素

不过那先 操作的土土最好的办法中会判断 modCount 的值否是因为变化,因为异常改变了,没有 就会抛出 ConcurrentModificationException 异常。

获取遍历器

清空列表

检测否是富含元素

SubList 也是继承于 AbstractList

先对 index 参数的有效性进行判断;

SubList 构造土土最好的办法可不都可不可不上能 有还还有一个 父列表。在获取、添加、删除元素的土土最好的办法中实际上完全都是 调用父列表中的土土最好的办法。

最后在 index 位置上赋值,并把 size 加 1。

此土土最好的办法通过有还还有一个 initialCapacity 变量对数组进行初始化。当传入的 initialCapacity 大于0时,elementData已经 初始化为大小为 initialCapacity 的空数组;或者已经 初始化为大小为0的空数组。

通过有还还有一个 元素对象进行删除

再执行 System.arraycopy 土土最好的办法把数组元素从 index 的位置后移1位;(System.arraycopy 函数后文完全都是讲到)

ensureCapacityInternal 中先判断 elementData 否是为空数组,因为是,则取 DEFAULT_CAPACITYminCapacity 的最大值作为数组的最小容量。

添加元素已经 ,调用了 ensureCapacityInternal 土土最好的办法,确保 elementData 数组有足够的空间。或者数组底下添加有还还有一个 元素,并把元素个数 size 的值加1。

它与底下 addAll 土土最好的办法的区别已经 先从 index 已经 开始了了移动 numNew 个位置,即空出 numNew 个位置。

还可不都可不可不上能看出 copyOf 函数最终调用的是 System.arraycopy 土土最好的办法。本文中 grow 土土最好的办法已经 调用 copyOf 来实现扩容的。

获取子列表

你这个 土土最好的办法是通过有还还有一个 Collection 对象进行初始化的。这里调用了 Arrays.copyOf 土土最好的办法将数组元素进行拷贝,并返回有还还有一个 新的数组。后文会完全解析你这个 土土最好的办法。

或者执行 ensureCapacityInternal 确保数组的容量大小是足够的,此时 modCount 也会自增;

还可不都可不可不上能看出要检测有还还有一个 元素否是在列表中,是通过遍历来实现的。

该类中 cursor 属性记录了当前迭代的位置,每调用一次 next 土土最好的办法完全都是加 1,lastRet 则记录了上一次的元素位置。

默认构造函数初始化 elementData 大小为10 空数组。