ArrayList 扩容机制
初始容量:
ArrayList() 会使用长度为零的数组
ArrayList(int initialCapacity) 会使用指定容量的数组
public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组容量
1、ArrayList() 无参构造时,给的时一个空白的数组 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,所以ArrayList初始容量为0:
2、ArrayList(int initialCapacity)时,参数为 initialCapacity,所以数组的容量为指定的容量:
3、ArrayList(Collection<? extends E> c)时,会使用集合c的大小作为数组的容量:
扩容的方式:
add(Object o) 首次扩容为 10,再次扩容为上次容量的 1.5 倍
addAll(Collection c) 没有元素时,扩容为 Math.max(10, 实际元素个数),有元素时为 Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)
1、add(Object o) 首次扩容为 10,再次扩容为上次容量的 1.5 倍
-
首次扩容会从0扩容成10,然后把添加到容量为0的数组中,然后长度为10的数组的替换长度为0的数组,然后丢弃数组为0的数组
第二次扩容会扩容到上一次容量的1.5倍,1.5倍指的是:先求扩容前容量的一半,然后再加入扩容前的容量===> 10>>1=5 ; 5+10=15
首次扩容会从0扩容成10,再次扩容会扩容到上一次容量的1.5倍,比如0,10,15,22,33…….
2、addAll(Collection c) 没有元素时,扩容为 Math.max(10, 实际元素个数),有元素时为 Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)
比如:list初始容量为0,然后调用addAll()进行扩容,首次扩容为容量是10,然后我们add 容量为11的数组,然后就会比较:Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)==>Math.max(10,11)===>11
比如:数组list已经有10个元素了,然后再add(1,2,3) 3个元素,会调用addAll()进行扩容,然后就会比较:Math.max(原容量 1.5 倍【即扩容后的容量大小】, 实际元素个数)==>Math.max(15,13)===>15
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)