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倍,并讲老数组赋给新的大数组,然后将新元素置于队尾。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-09-16 软工日报23-9-16