在Java中ArrayList默认容量是多少_Java集合扩容机制说明

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回收

如何避免不必要的扩容

如果预先知道集合大致规模,建议显式指定初始容量:

  • new ArrayList(20) —— 避免前几次add触发扩容
  • 对已知大小的集合做初始化,如 new Arr

    ayList(Arrays.asList(...))
    会直接使用实际长度作为初始容量
  • 批量添加前调用 ensureCapacity(int minCapacity) 预留空间

扩容带来的性能影响

虽然单次扩容是O(n)操作,但均摊下来每次add仍是O(1);不过高频扩容仍可能引发明显延迟,尤其在实时性要求高的场景或大数据量循环中。可借助JVM参数(如-XX:+PrintGCDetails)观察是否因频繁扩容导致短时对象激增、加剧GC压力。