深入 ensureCapacityInternal:ArrayList 扩容的第一道关卡

简介: `ensureCapacityInternal` 是 `ArrayList` 扩容的入口,首次添加元素时将最小容量设为10,避免频繁扩容。它区分默认构造与指定容量,优化性能,并为后续扩容提供准确容量需求,体现灵活性与效率的平衡设计。


ArrayListadd() 方法中,真正决定是否扩容的逻辑始于 ensureCapacityInternal(int minCapacity)。这个方法是扩容机制的入口点,负责处理初始容量设定和最小容量校准。


一、方法作用解析

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    ensureExplicitCapacity(minCapacity);
}
  • minCapacity:表示当前需要的最小容量(通常是 size + 1)。
  • DEFAULTCAPACITY_EMPTY_ELEMENTDATA:无参构造时 elementData 的初始值(一个共享的空数组)。
  • DEFAULT_CAPACITY:常量,值为 10

关键逻辑

如果是首次添加元素(即使用无参构造创建的 ArrayList),则将 minCapacity 至少设为 10

例如:第一次 add()minCapacity = 1,但会被提升为 10

这解释了为什么 new ArrayList<>() 在第一次添加元素后,内部数组容量是 10,而不是 1。


二、为什么这样设计?

  1. 避免频繁小容量扩容
    若首次只分配 1 个位置,第二次就要扩容到 2,第三次到 3……效率极低。
    直接初始化为 10,可满足大多数轻量级场景,减少早期扩容次数。
  2. 区分“显式指定容量”与“默认构造”
  • new ArrayList<>(5)elementData 不等于 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,不会强制设为 10;
  • new ArrayList<>():走默认逻辑,首次扩容至少 10。

三、后续流程:ensureExplicitCapacity

ensureCapacityInternal 最终调用 ensureExplicitCapacity(minCapacity),该方法会:

  • 检查 minCapacity 是否超过当前 elementData.length
  • 若超过,则触发真正的扩容(调用 grow() 方法,执行 1.5 倍扩容 + 数组拷贝)。

总结

ensureCapacityInternalArrayList 扩容机制中的智能预判层

  • 对默认构造的列表,首次扩容直接拉到 10,避免“一步一扩”;
  • 为后续的容量判断和实际扩容(grow)提供准确的 minCapacity 输入。

理解这一过程,有助于我们:

  • 合理预设初始容量(如已知要存 1000 条数据,就 new ArrayList<>(1000));
  • 避免因频繁扩容导致的性能抖动;
  • 更深入掌握 Java 集合类的设计哲学:在灵活性与效率之间取得平衡


相关文章
|
移动开发 JavaScript 小程序
uView Popup 弹出层
uView Popup 弹出层
448 0
|
开发工具 git
|
机器学习/深度学习 算法 前端开发
阿里面试官分享+真实面经+笔试模拟题 | 面试充电,就看这篇
阿里面试官分享+真实面经+笔试模拟题+招聘信息汇总,太全了!这篇合辑一定要看,不然就亏大啦!
阿里面试官分享+真实面经+笔试模拟题 | 面试充电,就看这篇
|
8月前
|
人工智能
Claude code AI 技能神器:Anthropic Skills!
Anthropic推出Claude AI技能神器Skills,将复杂任务打包成即插即用的“外挂”,让AI秒懂流程,告别重复提示。支持团队共享,提升效率数倍,三步搞定专业报告,堪称AI办公革命!
2061 4
|
5月前
|
Kubernetes 应用服务中间件 API
应对 Nginx Ingress 退役,是时候理清这些易混淆的概念了
本文希望提供一种更简单的方式,来理解这些容易混淆的技术概念:Nginx、Ingress、Ingress Controller、Ingress API、Nginx Ingress、Higress、Gateway API。
2560 159
|
3月前
|
人工智能 API 网络安全
OpenClaw玩转小红书运营保姆级教程:1分钟阿里云部署+百炼API配置+实战避坑指南
OpenClaw(前身为Clawdbot/Moltbot)是一款遵循MIT协议的开源、本地优先的AI自动化代理引擎,更是能落地各类实际工作场景的自托管式AI数字员工。它以自然语言指令为驱动,打破了传统AI仅能“生成内容、提供建议”的局限,通过“意图解析→任务规划→工具调用→结果反馈”的完整闭环,实现了从对话到实际执行的跨越。
1772 8
|
6月前
|
运维 监控 Unix
生产问题排查必备--grep
本文介绍了生产环境故障排查中如何高效使用grep命令分析日志。强调日志为“第一手证据”,推荐以日志分析为起点,结合grep的精准搜索、忽略大小写、显示上下文、正则匹配等技巧,快速定位问题。涵盖基础用法与进阶组合,提升运维效率。
|
8月前
|
存储 人工智能 JSON
揭秘 Claude Code:AI 编程入门、原理和实现,以及免费替代 iFlow CLI
本文面向对 AI Coding 感兴趣的朋友介绍 Claude Code。通过此次分享,可以让没有体验过的快速体验,体验过的稍微理解其原理,以便后续更好地使用。
3504 18
揭秘 Claude Code:AI 编程入门、原理和实现,以及免费替代 iFlow CLI
|
9月前
|
人工智能 安全 API
Dify平台集成安全护栏最佳实践
Dify平台提供低代码构建AI大模型应用的解决方案,支持云服务与私有化部署。本文介绍了在工作流和Agent中集成安全护栏的最佳实践,包括插件和扩展API两种方案。插件方式适用于工作流,一键安装实现输入输出防控;扩展API方式适用于Agent和工作流私有化部署场景,通过本地服务适配安全护栏API。文中还详细说明了操作步骤、前提条件及常见问题处理方法,帮助用户快速实现内容安全控制。
|
11月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会被擦除,JVM仅看到原始类型。例如,List&lt;String&gt;和List&lt;Integer&gt;在运行时均变为List。通过反射可绕过泛型限制添加任意类型元素,说明泛型信息仅存在于编译阶段。泛型擦除后保留的原始类型通常为Object,若有限定则使用限定类型。此机制引发了一些类型安全问题,但通过编译期检查可在一定程度上避免错误。
305 1

热门文章

最新文章