Java ArrayList扩容采用1.5倍增长是工程最优解,兼顾内存复用、复制开销、CPU效率与GC性能;其位运算实现高效精确,且具备动态适应机制,非僵化规则。

Java ArrayList 扩容采用 1.5 倍增长,不是随意设定,而是综合内存使用、复制开销、CPU 运算效率和实际运行表现后得出的工程最优解。
避免内存碎片,提升堆空间复用率
1.5 倍扩容(即 newCapacity = oldCapacity + (oldCapacity >> 1))生成的容量序列(如 10 → 15 → 22 → 33 → 49…)近似斐波那契式增长。这种节奏让历史上释放的旧数组块,在后续某次扩容时更可能被 JVM 内存分配器重新合并利用。而 2 倍扩容(10 → 20 → 40 → 80…)会持续留下无法被后续请求匹配的大块空闲内存,加剧堆碎片,抬高 GC 频率和停顿时间。
平衡扩容次数与单次复制成本
每次扩容都要调用 Arrays.copyOf(),本质是 System.arraycopy(),耗时为 O(n)。太小的增幅(如 1.2 倍)导致扩容次数猛增,总拷贝量上升;太大(如 2 倍)虽减少次数,但单次搬运数据更多,且预留大量未使用的空间。
- 从 10 扩到 15,只多占 5 个槽位,却避免了第 11、12、13、14 次 add 都触发扩容
- 从 15 扩到 22,增量为 7;若按 2 倍则需增至 30,多出 8 个冗余位置
- 整体上使每个元素分摊的“扩容成本”最低
位运算高效,天然适配整数约束
公式中用的是 oldCapacity >> 1,而非 oldCapacity * 1.5 或 oldCapacity / 2:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 右移一位是 CPU 级原子操作,无浮点计算、无舍入误差、无除法开销
- 结果恒为整数,完美契合数组长度必须是 int 的要求
- 规避了浮点乘法在边界值下可能引入的精度问题
它不是死规则,而是动态适应机制
1.5 倍只是默认“尽力增长”策略,并非硬性上限:
- 空列表首次 add(),直接设容量为 10,不走 1.5 倍计算
- addAll(100) 时当前容量仅 30,grow 会跳过 1.5 倍,直接设 newCapacity = 100
- 若 1.5 倍后仍小于所需最小容量(minCapacity),就以 minCapacity 为准
- 当 oldCapacity 接近 Integer.MAX_VALUE 时,会做溢出保护,退回到 MAX_ARRAY_SIZE 或抛异常
本质上,这是“尽量少扩、尽量少拷、尽量省内存、尽量快计算”的务实设计。

















