ensureCapacity用于预分配ArrayList容量以避免多次扩容开销,应在明确元素数量且远超默认容量10时调用,如批量添加5000个对象;推荐优先使用带参构造器,过度预估会浪费内存。

ensureCapacity 是 ArrayList 的一个预分配容量方法,它本身不提升单次操作效率,但能避免多次自动扩容带来的性能损耗——关键在于“提前告诉 ArrayList 你大概要存多少元素”。
什么时候该用 ensureCapacity
当你明确知道将要添加的元素数量**(尤其是批量添加前)**,且这个数量明显大于默认初始容量(10)时,调用它才有意义。比如读取一个已知大小的文件行数、解析固定长度的 JSON 数组、或初始化缓存列表。
- 添加 5 个元素?不用——默认容量 10 已够用
- 添加 5000 个对象?建议调用
ensureCapacity(5000) - 边循环边 add,且循环次数未知?没必要,甚至可能预估不准反而浪费内存
它怎么减少开销
ArrayList 底层是 Object[] 数组。每次 add 发现容量不足时,会创建新数组(通常是原容量 1.5 倍),再把旧数据复制过去——这是典型的 O(n) 操作。多次扩容 = 多次复制。
例如:从空开始 add 1000 个元素,默认触发约 10 次扩容,累计复制元素超 3000 次;而提前 ensureCapacity(1000),全程零扩容,只复制 0 次。
立即学习“Java免费学习笔记(深入)”;
怎么正确调用
在首次 add 前调用即可,越早越好:
ArrayList<String> list = new ArrayList<>();
list.ensureCapacity(2000); // 立即分配至少 2000 容量的数组
for (int i = 0; i < 2000; i++) {
list.add("item" + i);
}
- 传入值是最小所需容量,不是精确大小(内部可能向上取整)
- 如果已添加部分元素,ensureCapacity 仍有效——它保证总容量 ≥ 参数值
- 不会缩小容量,只扩容;已有元素不受影响
替代方案与注意事项
构造时指定初始容量更简洁,效果等同于立即 ensureCapacity:
// 这行代码内部就做了 ensureCapacity(500) ArrayList<Integer> list = new ArrayList<>(500);
- 对已知规模的场景,推荐直接用带参构造器,语义更清晰
- ensureCapacity 对已有大量元素的列表做“过度预估”(如传 100 万),会浪费内存,需权衡
- 它不改变 size(),也不影响遍历、get 等操作,纯属底层数组优化


















