源码阅读之ArrayList实现细节

  • 时间:
  • 浏览:1
  • 来源:大发5分快3APP下载_大发5分快3APP官方

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

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

通过顶端的 add 措施的走读,这种 措施就很好理解了。

这种 措施是通过有另一一个多 Collection 对象进行初始化的。这里调用了 Arrays.copyOf 措施将数组元素进行拷贝,并返回有另一一个多 新的数组。后文会完正解析这种 措施。

remove 措施则是通过调用内部内部结构类的 remove 措施来实现的。

不过有有哪些操作的措施中会判断 modCount 的值是不是很久变化,很久异常改变了,没办法 就会抛出 ConcurrentModificationException 异常。

执行流程为

获取子列表

index 位置加进去去进去有另一一个多 列表

但会 再空出的 numNew 位置加进去去进去元素。

minCapacity 表示目前必须的容量大小。很久它大于目前 elementData 的容量大小,没办法 就会执行 grow 措施增加数组容量。

可不必须看出 copyOf 函数最终调用的是 System.arraycopy 措施。本文中 grow 措施很久 调用 copyOf 来实现扩容的。

ArrayList 加进去去有另一一个多 元素

但会 再执行 ensureExplicitCapacity 措施。

这是数组拷贝函数,是 native 函数,它经过虚拟机优化的,传输速率比较高。在 ArrayList 中移动元素很久 通过这种 措施。

清空列表

此措施通过有另一一个多 initialCapacity 变量对数组进行初始化。当传入的 initialCapacity 大于0时,elementData很久 初始化为大小为 initialCapacity 的空数组;但会 很久 初始化为大小为0的空数组。

检测是不是暗含元素

可不必须看出要检测有另一一个多 元素是不是在列表中,是通过遍历来实现的。

但会 通过 fastRemove 措施进行删除。

首先检查下标是不是正确,但会 构造有另一一个多 SubList 对象,这是有另一一个多 内部内部结构类。

遍历列表元素

当传有另一一个多 元素对象进行删除操作时,必须遍历数组,找到该元素在列表中的位置 index

它会先把 Collection 对象通过 toArray 措施转化为数组,但会 再调用 System.arraycopy 进行数据的移动。

SubList 构造措施必须有另一一个多 父列表。在获取、加进去去、删除元素的措施中实际上完正一定会调用父列表中的措施。

在指定的 index 位置加进去去进去有另一一个多 元素

获取遍历器

SubList 也是继承于 AbstractList

Itr 是有另一一个多 内部内部结构类,实现了 Iterator 接口。

AbstractList 是继承于 Collection 接口。但会 简单的关系图可不必须表达为

再执行 System.arraycopy 措施把数组元素从 index 的位置后移1位;(System.arraycopy 函数后文一定会讲到)

ArrayList 可不必须说是 Java 程序猿最为常用的这种数据形态学 了。ArrayList 是通过数组实现的,容量可不必须自增的线性表。而数组的优点是计算机可不必须通过下标计算访问地址,很多很多很多很多访问元素的传输速率是比较慢了 的,时间繁复度为O(1);但数组从不擅长插入和删除操作,有有哪些操作的时间繁复度是O(n)。但会 ArrayList 继承了数组有有哪些特点。

以上有另一一个多 措施中也必须注意 ConcurrentModificationException 异常的趋于稳定。

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

该措施的逻辑是

但会 在调用 add 措施时,很久当前数组 elementData 的容量过高 时,就会调用扩容的 grow 措施,把数组扩大为原本 的1.5倍的大小。

该类中 cursor 属性记录了当前迭代的位置,每调用一次 next 措施一定会加 1,lastRet 则记录了上一次的元素位置。

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

删除指定 index 位置上的元素

它与顶端 addAll 措施的区别很久 先从 index 刚始于移动 numNew 个位置,即空出 numNew 个位置。

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

同样地,此措施中很久 modCount 被异常修改了(这类在其他程序中执行了 add 措施)没办法 就会抛出 ConcurrentModificationException 异常。

addAll 措施把有另一一个多 Collection 对象加进去去到列表中来。

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

加进去去元素很久,调用了 ensureCapacityInternal 措施,确保 elementData 数组有足够的空间。但会 数组顶端加进去去有另一一个多 元素,并把元素个数 size 的值加1。

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

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