ArrayList扩容采用位运算实现1.5倍增长:新容量=旧容量+(旧容量>>1),即右移一位等价于整除2,高效避免浮点运算;首次添加元素时若初始容量为0则直接设为10,后续扩容才按此规则。

Java 中 ArrayList 的扩容并不是简单地用“旧容量 × 1.5”来计算,而是通过位运算实现等效的 1.5 倍增长:新容量 = 旧容量 + (旧容量 >> 1)。
为什么是“旧容量 + 右移一位”?
右移一位(oldCapacity >> 1)等价于整数除以 2(向下取整)。所以:
oldCapacity + (oldCapacity >> 1) = oldCapacity × 1.5(向下取整)
例如:
- 旧容量为 10 → 10 + (10 >> 1) = 10 + 5 = 15
- 旧容量为 7 → 7 + (7 >> 1) = 7 + 3 = 10(不是 10.5,因为是整数运算)
扩容逻辑在源码中的体现
从 JDK 8 开始,ArrayList 的 grow() 方法中关键代码如下:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
int newCapacity = oldCapacity + (oldCapacity >> 1);
这行代码就是扩容的核心。它不依赖浮点运算,效率高,且避免了类型转换开销。
扩容还有最小容量保障
扩容计算只是第一步。实际新容量还需满足两个条件:
- 不能小于所需的最小容量(比如 add 时发现 size == elementData.length)
- 如果计算出的
newCapacity仍不够,就直接设为minCapacity - 若
newCapacity太大(超过MAX_ARRAY_SIZE),会调用hugeCapacity()进行兜底处理(如设为Integer.MAX_VALUE或MAX_ARRAY_SIZE)
初始容量和首次扩容的特殊情况
空参构造的 ArrayList 初始容量为 0,第一次添加元素时会直接分配默认容量 10(不是按 1.5 倍扩);而指定初始容量(如 new ArrayList(5))后,后续扩容才按 1.5 倍规则进行。

















