ArrayList默认初始容量为10,预估元素数量并指定初始容量可避免多次O(n)扩容复制,提升性能;适合批量初始化、固定分页查询及确定次数的循环添加等场景。

在 Java 中,ArrayList 默认初始容量是 10。如果预先知道要存入大量元素(比如几千或上万),直接使用无参构造器会导致多次扩容,触发数组复制,影响性能。指定合适的初始容量能避免不必要的扩容操作,提升插入效率。
为什么扩容会影响性能?
ArrayList 底层是动态数组,当添加元素超过当前容量时,会创建一个更大的新数组(通常是原容量的 1.5 倍),再把旧元素逐个复制过去。这个过程涉及内存分配和数据拷贝,时间复杂度为 O(n)。频繁扩容会显著拖慢批量添加操作。
如何合理指定初始容量?
-
预估准确数量:如果明确知道最终元素个数(如从数据库查出 5000 条记录),直接传入该值:
new ArrayList(5000) - 略留余量更稳妥:若数量有小幅波动,可加 5%~10% 缓冲,例如预估 950 个,设为 1000
- 避免过度预留:设成远超实际需要的值(如预估 100 却设 10000)会浪费内存,尤其在高并发或对象量大时需权衡
哪些场景特别适合指定容量?
- 批量初始化:读取文件、查询数据库后一次性 addAll
- 作为方法返回值且调用方已知规模(如 DAO 层返回固定分页结果)
- 循环中确定次数的 add 操作(如 for (int i = 0; i
注意点
指定初始容量只影响底层数组大小,不改变 ArrayList 的逻辑大小(size)。即使容量设为 1000,新建后 list.size() 仍是 0,不会自动填充 null 元素。也不影响 get、set 等随机访问操作的性能——它们本来就是 O(1)。



















