arraylist默认初始容量是10,使用无参构造器时底层数组长度即为10;若预估元素数量(如1000个),应显式指定初始容量以避免多次1.5倍扩容及对应数组复制开销。

在 Java 中,ArrayList 初始化时指定初始容量(Initial Capacity)能有效减少扩容带来的数组复制开销,尤其适用于可预估元素数量的场景。
为什么需要设置初始容量?
ArrayList 内部基于动态数组实现,默认构造器使用 DEFAULT_CAPACITY = 10。当添加元素超过当前容量时,会触发扩容:创建新数组(通常是原容量 1.5 倍),再将旧元素逐个复制过去。频繁扩容会导致额外的内存分配和复制操作,影响性能。
如果你明确知道最终要存入约 1000 个元素,却用默认构造器,可能经历多次扩容(如 10 → 15 → 22 → 33 → … → 1000),白白浪费 CPU 和内存。
如何正确指定初始容量?
使用带 int initialCapacity 参数的构造方法:
-
new ArrayList<string>(1000);</string>—— 预分配能容纳 1000 个元素的内部数组 - 容量是“最小容量”,不是“最大容量”;后续仍可继续 add,超出时自动扩容
- 传入值 ≤ 0 时,内部数组初始化为
EMPTY_ELEMENTDATA(空数组),首次 add 才真正分配默认容量(10)
常见误用与建议
不要盲目设过大容量。比如预估 500 元素却传入 10000,会造成内存浪费,尤其在大量实例共存时(如缓存、DTO 列表)。
合理做法:
- 根据业务逻辑或上游数据量预估(如分页查询每页 20 条 → 初始容量设为 20 或略高)
- 若完全无法预估,保持默认即可,避免过早优化
- 结合
ensureCapacity(int minCapacity)在运行时主动预留(适合分批添加前调用)
对比示例(小规模实测参考)
向列表添加 10 万个字符串:
- 默认构造:
new ArrayList()—— 约 17 次扩容,耗时相对高 - 指定容量:
new ArrayList(100000)—— 零扩容,add 耗时下降约 10%~20%(取决于 JVM 和数据规模)
注意:性能差异在小数据量(如
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











