ArrayList默认初始容量为10,是权衡内存占用、常见小批量数据场景(如分页10条)及扩容效率后的平衡选择;JDK 1.8起采用懒加载,首次add才分配长度10的数组,后续按1.5倍扩容。

Java 中 ArrayList 的默认初始容量设为 10,不是随意定的,而是综合了内存占用、常见使用场景和扩容效率后做的平衡选择。
为什么是 10,而不是 8 或 16?
10 这个数字不追求对齐内存或位运算优化(像 HashMap 那样需要 2 的幂),它更贴近真实业务中“小批量数据”的典型规模。比如存用户最近 5 条操作日志、一个表单的 7 个字段、一次分页查出的 10 条记录——这些都落在 5~15 的区间内。设为 10 能让多数情况免于首次扩容,又不会因预分配过大造成浪费。
对比来看:设太小(如 2)会导致频繁扩容;设太大(如 32)则空集合也占更多内存,对大量短生命周期的 ArrayList 不友好。
10 并不是一开始就分配的数组
JDK 1.8 起采用懒加载策略:
- 调用 new ArrayList() 时,
elementData指向的是一个共享的空数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA,长度为 0; - 第一次调用 add() 时,才真正分配长度为 10 的数组;
- 这个设计避免了“声明但不用”时的无谓内存占用。
扩容不是简单加 10,而是按 1.5 倍增长
初始容量为 10 只影响第一次分配,后续扩容遵循固定公式:
- 新容量 = 旧容量 + 旧容量 / 2(即 ×1.5 向下取整);
- 例如:10 → 15 → 22 → 33 → 49 ……
- 这种增长方式比固定增量(如每次+10)更能减少扩容次数,又比翻倍(×2)更节省内存。
实际开发中怎么用更合理?
如果能预估元素数量,直接传入构造参数更高效:
-
new ArrayList(50)—— 避免前几次扩容; -
new ArrayList(list.size())—— 从已有集合构建时常用; - 不确定大小时,保持默认即可,10 是经过长期验证的稳妥起点。
不需要为了“凑整”或“迷信 2 的幂”而刻意调整,ArrayList 的设计逻辑和使用场景跟 HashMap 有本质不同。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











