ArrayList默认初始容量为10,是JDK源码硬编码的经验值,兼顾性能与内存;合理创建需预估数量:明确时指定容量,不确定且量小时用默认构造,从集合构建则直接传入源集合。

Java 中 ArrayList 的默认初始容量是 10。这是 JDK 源码中硬编码的值(在 ArrayList 的无参构造方法里直接赋值为 10),不是动态计算出来的。
为什么默认是 10?
这是一个经验性折中值:既避免了太小导致频繁扩容(影响性能),又防止太大造成内存浪费。对大多数小规模集合操作(比如存几个字符串、几十个对象)来说,10 足够起步,且扩容成本可控。
怎么创建才合理?
关键原则是:**预估元素数量,尽量减少扩容次数**。每次扩容会触发数组复制(时间复杂度 O(n)),尤其在循环中反复 add 时容易成为瓶颈。
- 明确知道大概数量 → 直接传入初始容量
// 例如预计存 50 个用户ArrayListusers = new ArrayList(50); - 完全不确定数量,但确定不会太多(如配置项、参数列表)→ 用默认构造即可
ArrayListargs = new ArrayList(); // 安全,开销小 - 从已有集合构建 → 用带 Collection 的构造方法,它会按源集合 size 初始化容量
ArrayListlist = new ArrayList(otherList); // 内部调用 ensureCapacityInternal(otherList.size()) - 如果后续要批量添加大量元素(比如从数据库查出 1000 条)→ 先设好容量再 addAll,比逐个 add 更高效
ArrayList<order> orders = new ArrayList(1000);<br>orders.addAll(queryFromDb());</order>
扩容机制简要说明
当元素数量超过当前容量时,ArrayList 会扩容为原容量的 1.5 倍(JDK 1.8+):newCapacity = oldCapacity + (oldCapacity >> 1);
比如 10 → 15 → 22 → 33 → 49 → 73 … 不是简单的翻倍,兼顾增长速度和内存利用率。
不推荐的做法
- 无脑写
new ArrayList(1)或(0)—— 立马触发扩容,反而多一次复制 - 过度保守,比如只预估 10 却传 1000 —— 浪费堆内存,尤其对象多时易引发 GC 压力
- 在循环内反复用默认构造然后 add —— 扩容可能多次发生,性能明显下降
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











