ArrayList add方法的实现之扩容

初探ArrayList的1.5倍扩容

add方法是通过在list的尾部追加元素的方法,添加数据的。

其中,调用了一个叫ensureCapacityInternal方法,实现list的容量换算等:

注意:参数传的是当前需要的最小的容量,方法首先确认当前ArrayList实例是否为空,如果为空则比较所需容量和默认容量,取其大者作为所需最小容量值。然后执行ensureExplicitCapacity进一步确定容量,以及是否需要扩容。当所需最小容量大于当前elementData数组长度时,要进行扩容操作。

以上只是真实容量和所需容量的比较,其目的是计算出list的最终容量。真正实现扩容的方法是grow方法:

通过上述:我们大概可知当add一个元素时候的扩容流程。

添加一个元素,首先计算当前的list所需最小的容量大小,是否需要扩容等。当需要扩容时:

1.得到当前的ArrayList的容量(oldCapacity)。

2.计算除扩容后的新容量(newCapacity),其值(oldCapacity + (oldCapacity >> 1))约是oldCapacity 的1.5倍。

这里采用的是移位运算(关于移位运算,后续会讲到)。为什么采用这种方法呢?应该是出于效率的考虑。

3.当newCapacity小于所需最小容量,那么将所需最小容量赋值给newCapacity。

4.newCapacity大于ArrayList的所允许的最大容量,处理。

5.进行数据的复制,完成向ArrayList实例添加元素操作。

原文地址:https://www.cnblogs.com/thiaoqueen/p/8392897.html