ArrayList扩容逻辑为“容量检查→计算最小需求→触发增长→分配复制”:add(E)先调用ensureCapacityInternal(size+1),首次扩容默认为10,后续按1.5倍增长,不足则取minCapacity,最后Arrays.copyOf完成替换。

直接从 add(E) 方法入手,顺着调用链一层层往下追,就能完整定位扩容逻辑。关键不是背代码,而是抓住“容量检查 → 计算最小需求 → 触发增长 → 分配复制”这条主线。
从 add() 开始:触发点很明确
每次调用 add(E e),第一件事就是检查容量是否够用:
- 源码里会执行
ensureCapacityInternal(size + 1),这里的size + 1就是“加完这个元素后至少需要多少空间” - 如果当前
elementData.length小于这个值,就进入扩容流程;否则直接赋值elementData[size++] = e
看 ensureCapacityInternal:区分首次添加和后续扩容
这个方法会先调用 calculateCapacity(elementData, minCapacity):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 若
elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA(无参构造的初始状态),则返回Math.max(DEFAULT_CAPACITY, minCapacity),也就是首次默认扩到 10 - 否则直接返回传入的
minCapacity
进 grow():真正干活的地方
最终走到 grow(int minCapacity),核心逻辑三步走:
- 读旧容量:
int oldCapacity = elementData.length - 算新容量:
int newCapacity = oldCapacity + (oldCapacity >> 1)(即 1.5 倍) - 兜底校验:若
newCapacity ,就直接设为minCapacity;再防溢出,超过MAX_ARRAY_SIZE就进hugeCapacity - 最后调用
Arrays.copyOf(elementData, newCapacity)完成数组替换
调试小技巧:快速验证扩容行为
写个最简测试,打断点效果立竿见影:
- 用无参构造
new ArrayList(),add 第一个元素时,elementData会从长度 0 变成 10 - 连续 add 到第 11 个,观察
oldCapacity = 10→newCapacity = 15 - 用反射或调试器查看
elementData.length,比查文档更直观
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










