ArrayList动态扩容机制中1.5倍增长系数逻辑

老婷姑娘_8764

老婷姑娘_8764

2026-03-28

887人浏览

原创

arraylist扩容系数设为1.5倍是空间与时间效率的工程折中:2倍易致内存浪费和gc压力,1.2倍扩容频繁增加拷贝开销,1.8倍接近2倍浪费;1.5倍摊还成本低、整数运算高效且兼容历史生态。

arraylist动态扩容机制中1.5倍增长系数逻辑

ArrayList 的扩容系数设为 1.5 倍,是空间效率与时间效率之间权衡的结果,并非数学最优,而是工程实践中的合理折中。

为什么不是 2 倍?

2 倍扩容虽简化计算(位运算即可),但容易造成内存浪费:

  • 假设初始容量 10,连续扩容:10 → 20 → 40 → 80 → 160……每次新增一倍,旧数组中已存元素只占新数组一半,闲置空间持续累积;
  • 尤其在集合长期稳定、不再大幅增长时,高位容量长期空置,GC 压力和堆内存碎片增加;
  • 对大对象(如存储大量字符串或自定义对象)而言,一次翻倍可能直接触发老年代分配或 Full GC。

为什么不是 1.2 或 1.8?

1.5 是兼顾摊还成本与内存利用率的经验值:

  • 摊还分析:按 1.5 倍扩容,插入 n 个元素的总拷贝次数约为 2n(几何级数求和),均摊 O(1);1.2 倍虽更省空间,但扩容频次显著上升,拷贝开销变大;1.8 倍则接近 2 倍的浪费问题;
  • 整数运算友好:oldCapacity + oldCapacity >> 1 等价于 oldCapacity * 1.5,仅用位移+加法,无浮点或除法,JVM 可高效优化;
  • 历史兼容性:从 JDK 1.2 沿用至今,类库生态(如 subList、迭代器行为)均基于该增长节奏设计。

实际扩容过程的关键细节

扩容不是简单乘以 1.5,而是有兜底与校验逻辑:

  • 新容量 = oldCapacity + (oldCapacity >> 1),即 oldCapacity * 1.5 向下取整(因右移是整数除法);
  • 若计算结果 ≤ 0(如 oldCapacity 为负溢出),则使用 Integer.MAX_VALUE;
  • 若所需最小容量 minCapacity > 计算所得 newCapacity,则直接取 minCapacity(例如构造时指定 huge initialCapacity 或 addAll 超大集合);
  • 最终容量还会被限制在 MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8(部分 JVM 预留数组元数据空间)。

对开发者的启示

理解 1.5 倍背后逻辑,有助于写出更高效的代码:

  • 明确预期大小时,优先使用 new ArrayList(initialCapacity),避免多次扩容拷贝;
  • 批量添加前可调用 ensureCapacity(minCapacity) 预分配;
  • 注意 size() 和 capacity()(后者需反射或通过估算获取)的区别——容量不等于已用空间;
  • 在内存敏感场景(如 Android 或实时系统),可考虑替代实现(如 Trove、Eclipse Collections)或手动控制扩容节奏。
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

570

5

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

2023.07.24

4746

6

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

2023.11.02

7199

18

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2784

5

eclipse和idea有什么区别
eclipse和idea有什么区别

eclipse和idea的区别:1、平台支持;2、内存占用;3、插件系统;4、智能代码提示;5、界面设计;6、调试功能;7、学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

622

5

eclipse设置中文全教程
eclipse设置中文全教程

本专题整合了eclipse设置中文相关教程,阅读专题下面的文章了解更多详细操作。

2025.10.10

3026

11

eclipse字体放大教程
eclipse字体放大教程

本专题整合了eclipse字体放大教程,阅读专题下面的文章了解更多详细内容。

2025.10.10

3045

12

eclipse左边栏不见了解决方法
eclipse左边栏不见了解决方法

本专题整合了eclipse左边栏相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.15

408

3

eclipse字体相关教程
eclipse字体相关教程

本专题整合了eclipse字体设置相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.26

834

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.3万人学习