java list 如何扩容
Java List 扩容机制
Java中的List接口有多种实现类,其中ArrayList是最常用的动态数组实现。其扩容机制如下:
默认初始容量
ArrayList的默认初始容量为10。当创建ArrayList对象时,如果没有指定初始容量,内部会创建一个长度为10的数组。
触发扩容条件
当向ArrayList添加元素时,如果当前元素数量已达到数组长度(即容量已满),则会触发扩容操作。
扩容计算公式 扩容时,新容量通常为旧容量的1.5倍(即旧容量 + 旧容量右移1位)。计算公式如下:
int newCapacity = oldCapacity + (oldCapacity >> 1);
扩容流程
- 计算新容量(通常是旧容量的1.5倍)。
- 创建新数组,大小为计算得到的新容量。
- 使用
System.arraycopy()将旧数组中的元素复制到新数组中。 - 更新内部数组引用,指向新数组。
示例代码
// 创建ArrayList
List<Integer> list = new ArrayList<>();
// 添加元素触发扩容
for (int i = 0; i < 20; i++) {
list.add(i);
}
手动指定初始容量 可以通过构造函数指定初始容量,避免频繁扩容:
List<Integer> list = new ArrayList<>(100);
扩容性能考虑 频繁扩容会导致性能开销,因为每次扩容都需要复制数组。在预先知道大致元素数量的情况下,指定初始容量可以提高性能。
其他List实现的扩容

Vector:默认扩容为旧容量的2倍(可通过构造函数指定扩容增量)。LinkedList:不需要扩容,因为是链表结构。CopyOnWriteArrayList:每次修改操作都会创建新数组。






