ArrayList默认初始容量为10,由静态常量DEFAULT_CAPACITY=10定义,是权衡内存占用与扩容开销的经验值;扩容时新容量为原容量1.5倍,不足则取所需最小容量,本质是创建新数组并复制数据。

Java中ArrayList的默认初始容量是10(JDK 7及以后版本)。这个值在源码中由静态常量 DEFAULT_CAPACITY = 10 定义,当调用无参构造方法 new ArrayList() 时生效。
ArrayList的默认容量是怎么确定的
该默认值并非随意设定,而是权衡了内存占用与扩容开销后的经验值:太小会导致频繁扩容(涉及数组复制),太大则浪费初始空间。JDK源码中明确写死为10,且从JDK 7开始一直保持不变(JDK 6为10,JDK 5也是10,早期版本略有差异但现代开发基本不涉及)。
扩容机制的核心规则
当添加元素导致当前数组满时,ArrayList会触发扩容,新容量按以下逻辑计算:
- 新容量 = 当前容量 × 1.5(即
oldCapacity + (oldCapacity >> 1)) - 若计算结果仍不足以容纳所需最小容量(比如一次addAll大量元素),则直接取所需最小容量
- 扩容本质是创建新数组,并用
System.arraycopy将原数据复制过去 - 扩容后老数组失去引用,等待GC回收
如何避免不必要的扩容
如果预先知道集合大致规模,建议显式指定初始容量:
立即学习“Java免费学习笔记(深入)”;
-
new ArrayList(20)—— 避免前几次add触发扩容 - 对已知大小的集合做初始化,如
new ArrayList(Arrays.asList(...))会直接使用实际长度作为初始容量 - 批量添加前调用
ensureCapacity(int minCapacity)预留空间
扩容带来的性能影响
虽然单次扩容是O(n)操作,但均摊下来每次add仍是O(1);不过高频扩容仍可能引发明显延迟,尤其在实时性要求高的场景或大数据量循环中。可借助JVM参数(如-XX:+PrintGCDetails)观察是否因频繁扩容导致短时对象激增、加剧GC压力。










