首页 > 编程语言 >Arraylist源码分析:如何实现一次add操作?

Arraylist源码分析:如何实现一次add操作?

时间:2024-09-16 10:51:40浏览次数:13  
标签:初始化 容量 Arraylist elementData add 源码 数组 添加

注意:这里是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

相关文章