Arraylist源码分析:如何实现一次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倍,并讲老数组赋给新的大数组,然后将新元素置于队尾。

 

posted @   天启A  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2023-09-16 软工日报23-9-16
点击右上角即可分享
微信分享提示