Java 中的
扩容机制如下:
-
初始容量:
- 创建一个新的 ArrayList 时,默认初始容量为 10(在某些版本或实现中可能不同)。
-
扩容触发条件:
- 当 ArrayList 的元素数量等于当前容量时,再尝试添加新元素时就会触发扩容操作。
-
扩容策略:
- 扩容的具体策略是将现有容量翻倍,即新的容量等于旧容量的两倍加一(
newCapacity = oldCapacity + (oldCapacity >> 1) ),这样可以保证随着元素数量的增长,扩容操作发生的次数相对较少,从而提高性能。
- 扩容的具体策略是将现有容量翻倍,即新的容量等于旧容量的两倍加一(
-
拷贝元素:
- 在扩容后,需要将原有数组中的所有元素复制到新的、更大容量的数组中。
- 使用系统级的数组复制方法如
System.arraycopy() 来完成这个过程,这比逐个元素移动效率更高。
-
空间浪费:
- 扩容操作可能导致一定的空间浪费,尤其是在元素数量与实际所需容量差距较大的情况下。可以通过设置合适的初始容量或通过构造函数指定容量来避免不必要的空间浪费。
例如,在代码层面,当你调用
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); // 预期的新容量 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
以上是对