ArrayList初始化以及扩容机制
网上很多关于ArryList集合的说法,很多说法是错误的,自己详细记录一下
1.ArryList的初始化长度
首先查看源码部分
这是ArrayList 的构造方法,很明显,在初始化的时候,如果不传入参数的话,就是一个空数组,所以他初始化长度是 0!!!
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
2.关于ArrayList的扩容机制
2.1 add()方法
源码上看,第一 ArryList 首次扩容会扩大10 的长度
接下来看重点代码,最后总结出来,除了首次扩容是10,其次都是上次的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
oldCapacity 之前的长度,那么这个计算公式就是 当前长度= 上次的长度+(上次长度除以2)) ,也就是 原长度的1.5
private static final int DEFAULT_CAPACITY = 10;
1.添加
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } 2.调用 private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } 3.首次条件是否扩容 private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; }
4.不是首次扩容
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
2.2 addAll()方法
addAll的源码就不上了,直接说了,addAll 扩容是根据就近原则,选择最大值扩容
1.第一次扩容小于10 ,那么直接扩容为10
2.第一次扩容大于10.小于1.5 ,长度就是当前的集合长度
3.二次扩容的时候 小于1.5 ,扩容其1.5倍
4.二次扩容大于 1.5 长度就是当前集合长度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!