ArrayList扩容按1.5倍增长,即newCapacity = oldCapacity + (oldCapacity >> 1);触发条件是size + 1 > elementData.length;grow()先计算基础扩容值,再与minCapacity比较取大者,最后检查是否超MAX_ARRAY_SIZE。

Java 中 ArrayList 扩容时,新容量不是固定加某个数,而是按比例增长——默认为旧容量的 1.5 倍(即增加 50%),但具体计算方式是通过位运算实现的: newCapacity = oldCapacity + (oldCapacity >> 1)。这个设计兼顾了效率与空间利用率。
扩容触发的准确条件
扩容发生在添加元素前的一次判断中:
当 size + 1 > elementData.length 时,说明当前数组已满,下一次 add 就会触发 grow() 方法。
注意:不是“存满才扩容”,而是“再加一个就放不下”,所以临界点是 size 等于数组长度。
新容量的三步计算逻辑
grow() 方法内部按顺序处理:
- 先算基础扩容值:oldCapacity + (oldCapacity >> 1),比如旧容量是 10 → 10 + 5 = 15;旧容量是 15 → 15 + 7 = 22(右移取整,不四舍五入)
- 再和“最小需要容量”(minCapacity = size + 1)比较:如果算出的新容量仍小于 minCapacity,就直接用 minCapacity。例如无参构造后第一次 add 100 个元素,不会先扩到 10 再反复扩,而是一次到位设为 100
- 最后检查上限:若 newCapacity 超过 MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8),则按 hugeCapacity() 处理,可能设为 Integer.MAX_VALUE
不同初始化方式对首次扩容的影响
初始状态决定了第一次扩容的行为:
- new ArrayList():elementData 指向 DEFAULTCAPACITY_EMPTY_ELEMENTDATA(空数组),第一次 add 时直接扩容到 10
- new ArrayList(5):elementData 长度就是 5,后续扩容仍按 1.5 倍规则,从 5→7→10→15…
- new ArrayList(100):初始容量 100,只要最终元素 ≤ 100,全程零扩容
批量添加时的特殊优化
调用 addAll() 时,ArrayList 会提前算出最终所需总容量(size + 新增数量),然后一次性 grow 到足够大小,避免边加边扩的多次复制。比如已有 80 个元素,要 addAll 30 个,它会直接扩容到至少 110,而不是从 80→120→180 这样跳两次。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











