通过实例深入理解 ArrayList 的 grow() 方法与长度概念辨析

简介: 本文详解 Java 中 ArrayList 的动态扩容机制,通过逐步追踪 grow() 方法,解析其 1.5 倍扩容策略与首次扩容至 10 的设计。结合添加元素过程,阐明容量增长逻辑,并对比 length、length()、size() 的易混淆用法,帮助开发者规避常见误区,提升代码性能与规范性。


在 Java 中,ArrayList 的动态扩容机制依赖于其内部的 grow() 方法。结合具体添加元素的过程,我们可以清晰看到扩容是如何一步步发生的。


🌰 示例:逐步追踪 grow() 行为

1. 添加第 1 个元素

  • 初始:elementData = [](空数组),size = 0
  • 调用 add(e)ensureCapacityInternal(1)
  • 因是默认构造,minCapacity = max(10, 1) = 10
  • 进入 grow(10)
  • oldCapacity = 0
  • newCapacity = 0 + (0 >> 1) = 0
  • 第一个 if 成立0 < 10newCapacity = 10
  • 第二个 if 不成立10 < MAX_ARRAY_SIZE(通常为 Integer.MAX_VALUE - 8
  • 执行 Arrays.copyOf(elementData, 10)
  • 结果:容量变为 10size = 1

2. 添加第 11 个元素

  • 此时:elementData.length = 10size = 10
  • minCapacity = 11
  • 进入 grow(11)
  • oldCapacity = 10
  • newCapacity = 10 + (10 >> 1) = 15
  • 第一个 if 不成立15 ≥ 11
  • 第二个 if 不成立15 远小于最大数组大小
  • 执行 Arrays.copyOf(..., 15)
  • 结果:容量变为 15size = 11

3. 后续扩容

  • 第 16 个元素 → 扩容至 15 + 7 = 22
  • 第 23 个元素 → 扩容至 22 + 11 = 33
  • ……依此类推,始终按 1.5 倍增长,直到满足需求或触及上限。

⚠️ 只有当 newCapacity > MAX_ARRAY_SIZE 时,才会调用 hugeCapacity(),处理超大数组(极罕见场景)。


🔍 容易混淆的“长度”概念:lengthlength()size()

这是 Java 初学者常踩的坑,务必区分清楚:

类型 获取方式 说明
数组(Array) arr.length 属性,不是方法。例如:int[] a = new int[5]; a.length → 5
字符串(String) str.length() 方法。例如:"hello".length() → 5
集合(Collection / List / Set 等) list.size() 方法。例如:new ArrayList<>().size() → 0

记忆口诀

  • 数组用 .length(无括号)  
  • 字符串用 .length()(有括号)  
  • 集合用 .size()(语义更清晰)

❌ 错误示例:

List<String> list = new ArrayList<>();
int len = list.length; // 编译错误!
String s = "abc";
int l = s.length;      // 编译错误!

总结

  • ArrayListgrow() 方法通过 1.5 倍扩容 + 最小容量兜底,平衡性能与内存;
  • 首次添加即扩容到 10,避免小步快跑;
  • 扩容本质是 数组复制,应尽量通过预设容量避免;
  • 牢记 lengthlength()size() 的使用场景,写出更规范的代码。

理解这些细节,不仅能避免性能陷阱,也能提升代码的健壮性与可读性。


相关文章
|
13天前
|
数据采集 人工智能 安全
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
644 4
|
8天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
348 164
|
7天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
359 155

热门文章

最新文章