初始化
实例化ArrayList时,并不会给Object[]数组直接分配一个为10的空间,而是初始化一个空的数组

调用add()方法时
- 先调用ensureCapacityInternal确保容量够用,参数为当前容量的size+1
- ensureCapacityInternal紧接着调用calculateCapacity方法来计算出最终需要的容量大小

- 由上图源码可看出,首次进行add时,会判断当前数组是否为空,若为空则指定初始化容量大小为10,若不为空则当前size+1
- 随后调用ensureExplicitCapacity方法来判断当前所需容量是否够用,若不够用则扩容,扩容则调用grow方法。在判断容量大小是否够用时会先对modCount进行++,避免并发修改问题,此处使用增强for对list进行修改时会出现ConcurrentModificationException异常问题
- 调用grow方法时会对原本数组的长度进行位运算,右移一位,大概为原本长度的1/2,故新数组的长度为原数组长度+原数组长度/2 约等于 1.5倍的扩容,若扩容后的容量比所需的最小容量还要小,则直接使用所需的最小容量的长度,随后调用Arrays.copyOf(elementData, newCapacity)进行新老数组的拷贝,扩容完成后返回新的数组,并在add方法中进行赋值

评论区