注意:这里是JDK17,和JDK8略微有所不同
成员变量
add操作:
0.(初始化,常用)在初始化new ArrayList的时候,会给elementData赋一个有区别的空列表,以便下面使用。
1.将指定元素添加至队尾,返回一个布尔值
2.add的抽离方法,当size和elementData.length一样大的时候就该需要扩容了,调用grow方法
3.封装了一层grow
4.实际的grow,获取当前数组的长度oldCapacity
如果不是第一次add(oldCapacity>0说明数组里已经有内容了),或者数组构建不是new ArrayList()的(还有初始化指定容量的,初始化指定已有集合两种情况)
通过给当前容量扩大1.5倍,然后将已有elementData赋值给新的elementData。这时会返回一个新的,扩容完成的数组。
如果是第一次add,并且数组的构建是基于new ArrayList()的。这时minCapacity应该是1,取DEFAULT_CAPACITY(10),初始化了一个大小为10的容器。
5.其他方法-确保容量(不会用在这个流程内)
计算当前容量,当容量不足的时候会触发grow进行扩容(在JDK17中,这个方法好像没有被使用)
总结:
arraylist初始化有三种情况:默认的、指定容量的、指定内容的。
一般我们使用都是默认的情况:默认情况的添加分为三种情况:第一次添加,length未溢出的添加,length溢出的添加
在第一次add时,arraylist会有一个默认的初始容量10提供使用。
在add执行且容器未满时,首先会置出一个预留位置,如果算上这个位置后size仍然没溢出则可以直接正常将元素添加至arraylist内的队尾;
在add执行且容器满了的时候,则需要进行arraylist的扩容,增大容量1.5倍,并讲老数组赋给新的大数组,然后将新元素置于队尾。
标签:初始化,容量,Arraylist,elementData,add,源码,数组,添加 From: https://www.cnblogs.com/kun1790051360/p/18416075