arraylist扩容本质是懒扩容加倍增复制:首次add初始化容量为10;后续按oldcapacity + (oldcapacity >> 1)计算新容量,再数组拷贝。

ArrayList 扩容本质是“懒扩容 + 倍增复制”:首次 add 时初始化容量为 10;后续容量不足时,新容量 = 旧容量 × 1.5(即 oldCapacity + (oldCapacity >> 1)),然后数组拷贝。
初始容量与触发时机
默认构造器创建的 ArrayList 初始不分配数组,第一次 add 才初始化为长度 10 的 Object[];每次 add 前检查 size 是否 ≥ elementData.length,满足即触发扩容。
扩容计算公式(关键细节)
新容量按整数运算计算:
newCapacity = oldCapacity + (oldCapacity >> 1),等价于 oldCapacity * 1.5 向下取整。
例如:10 → 15,15 → 22,22 → 33,不是严格 2 倍,避免过度浪费又保证摊还效率。
扩容过程三步走
- 计算新容量(若小于所需最小容量,则直接取最小容量)
- 用
Arrays.copyOf()创建新数组并复制原元素 - 更新
elementData引用指向新数组
注意点(常被追问)
- 扩容是线程不安全的,多线程下可能引发数据覆盖或扩容丢失
- 大量新增前可预设初始容量(如
new ArrayList(expectedSize)),避免多次复制 - 扩容本身是 O(n) 操作,但均摊时间复杂度仍是 O(1)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











