源码阅读之ArrayList实现细节

  • 时间:
  • 浏览:0
  • 来源:uu快3开奖历史_uu快3玩法_注册

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

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

获取子列表

这是数组拷贝函数,是 native 函数,它经过虚拟机优化的,下行带宽 比较高。在 ArrayList 中移动元素时候通过這個 依据。

通过4个多 多元素对象进行删除

首先检查下标有无正确,时候构造4个多 多 SubList 对象,这是4个多 多组织组织结构类。

执行流程为

ArrayList 上加4个多 多元素

该依据的逻辑是

检测有无蕴含元素

删除指定 index 位置上的元素

SubList 也是继承于 AbstractList

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

上加元素时候,调用了 ensureCapacityInternal 依据,确保 elementData 数组有足够的空间。时候数组上面上加4个多 多元素,并把元素个数 size 的值加1。

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

addAll 依据把4个多 多 Collection 对象上加到列表中来。

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

再执行 System.arraycopy 依据把数组元素从 index 的位置后移1位;(System.arraycopy 函数后文有的是讲到)

index 位置上上加4个多 多列表

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

這個 依据是通过4个多 多 Collection 对象进行初始化的。这里调用了 Arrays.copyOf 依据将数组元素进行拷贝,并返回4个多 多新的数组。后文会完整解析這個 依据。

以上4个多 多依据中也时需注意 ConcurrentModificationException 异常的处在。

不过哪几个操作的依据中会判断 modCount 的值有无机会变化,机会异常改变了,那么就会抛出 ConcurrentModificationException 异常。

Itr 是4个多 多组织组织结构类,实现了 Iterator 接口。

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

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

获取遍历器

可不还上能看出 copyOf 函数最终调用的是 System.arraycopy 依据。本文中 grow 依据时候调用 copyOf 来实现扩容的。

remove 依据则是通过调用组织组织结构类的 remove 依据来实现的。

minCapacity 表示目前时需的容量大小。机会它大于目前 elementData 的容量大小,那么就会执行 grow 依据增加数组容量。

在指定的 index 位置上上加4个多 多元素

时候再空出的 numNew 位置上上加元素。

同样地,此依据中机会 modCount 被异常修改了(例如在许多程序运行运行中执行了 add 依据)那么就会抛出 ConcurrentModificationException 异常。

时候在调用 add 依据时,机会当前数组 elementData 的容量过高 时,就会调用扩容的 grow 依据,把数组扩大为从前 的1.5倍的大小。

时候通过 fastRemove 依据进行删除。

该类中 cursor 属性记录了当前迭代的位置,每调用一次 next 依据有的是加 1,lastRet 则记录了上一次的元素位置。

它与上面 addAll 依据的区别时候先从 index 始于移动 numNew 个位置,即空出 numNew 个位置。

此依据通过4个多 多 initialCapacity 变量对数组进行初始化。当传入的 initialCapacity 大于0时,elementData时候初始化为大小为 initialCapacity 的空数组;时候时候初始化为大小为0的空数组。

ArrayList 可不还上能说是 Java 程序运行运行猿最为常用的一种生活数据形态学 了。ArrayList 是通过数组实现的,容量可不还上能自增的线性表。而数组的优点是计算机可不还上能通过下标计算访问地址,统统有访问元素的下行带宽 是变快的,时间多样化度为O(1);但数组暂且擅长插入和删除操作,哪几个操作的时间多样化度是O(n)。时候 ArrayList 继承了数组哪几个特点。

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

SubList 构造依据时需4个多 多父列表。在获取、上加、删除元素的依据中实际上完整有的是调用父列表中的依据。

时候再执行 ensureExplicitCapacity 依据。

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

清空列表

通过上面的 add 依据的走读,這個 依据就很好理解了。

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

遍历列表元素