0

0

Java 中 ArrayList 与手动扩容数组的本质区别与性能影响

碧海醫心

碧海醫心

发布时间:2026-01-15 17:51:14

|

732人浏览过

|

来源于php中文网

原创

Java 中 ArrayList 与手动扩容数组的本质区别与性能影响

arraylist 并非语法糖,而是基于动态数组实现的成熟集合类;其核心逻辑与手动扩容数组相似,但通过智能扩容策略(如 1.5 倍增长)实现了 o(1) 摊还插入时间复杂度,而 naïve 线性扩容会导致 o(n²) 性能退化。两者均在堆内存中存储数据,但 arraylist 具备泛型支持、接口契约、边界安全及经过充分验证的工程优化。

在 Java 中,ArrayList 的底层确实是一个动态扩容的普通数组——它没有使用任何 native 代码或 JVM 特殊机制,完全由纯 Java 实现。从这个角度看,你自定义的 myArrayList 类在思想上与 ArrayList 高度一致:维护一个底层数组、一个元素计数器(size),并在容量不足时创建更大数组并复制数据。然而,这种“形似”掩盖了关键的工程差异与设计权衡

? 核心差异:不只是“方便”,更是正确性与效率的保障

维度 myArrayList(示例) ArrayList(JDK 实现)
泛型支持 仅支持 int,硬编码类型,无法复用 支持 ArrayList<Integer> 等泛型,编译期类型安全(擦除后仍为 Object[])
扩容策略 每次 +10(线性增长)→ O(N²) 时间复杂度 按当前容量 1.5 倍扩容(如 newCapacity = oldCapacity + (oldCapacity >> 1))→ O(1) 摊还插入成本
边界行为 set(i, x) 超出范围时隐式扩容(类似稀疏数组) set(i, x) 要求 i < size(),否则抛 IndexOutOfBoundsException,严格遵循 List 接口语义
内存布局 存储原始 int → 零装箱开销,但丧失多态性 存储 Integer 对象 → 有装箱/拆箱成本,但可参与面向接口编程(如 List<? extends Number>)
功能完备性 仅基础增删查,无迭代器、批量操作、结构性修改检查等 完整实现 List 接口,支持 subList()、replaceAll()、spliterator() 及 fail-fast 迭代器
✅ 关键性能对比示例:向空容器添加 N 个元素 myArrayList(+10 策略):第 1 次扩容复制 10 个元素,第 2 次复制 20 个……总复制量 ≈ Σ₁^N i ≈ N²/2 → O(N²) ArrayList(1.5 倍策略):扩容次数约 log₁.₅N,每次复制量呈几何级数增长,总复制量 ≈ 2N → O(N) 摊还复杂度
// JDK ArrayList 的典型扩容逻辑(简化示意)
private Object[] grow(int minCapacity) {
    int oldCapacity = elementData.length;
    // 关键:新容量 = 旧容量 + 旧容量/2(即 1.5 倍)
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    return elementData = Arrays.copyOf(elementData, newCapacity);
}

⚠️ 不可忽视的工程现实

  • 堆内存使用一致:二者底层数组均分配在 JVM 堆中(new int[...] 和 new Object[...] 都是堆对象),不存在/本地内存差异。
  • 不要重复造轮子:除非有极端场景(如高频数值计算需避免装箱、或嵌入式环境严控内存碎片),否则自行实现 ArrayList 几乎必然导致:
    • 更差的缓存局部性(小步长扩容导致内存不连续)
    • 缺少并发安全包装(Collections.synchronizedList() 或 CopyOnWriteArrayList)
    • 无结构性修改检测(ConcurrentModificationException)
    • 无 JMH 基准测试验证的边界 case 覆盖(如负容量、溢出处理)

✅ 正确的选择路径

  • 通用场景:直接使用 ArrayList<T> —— 它是经过 20+ 年演进、数十亿行生产代码验证的最优解。
  • 高性能数值计算:选用专业库,如 Trove(TIntArrayList)、Eclipse Collections(MutableIntList)或 JDK 17+ 的 Vector API(面向 SIMD 优化)。
  • 深度理解原理:阅读 OpenJDK 源码(src/java.base/share/classes/java/util/ArrayList.java),重点关注 ensureCapacityInternal()、grow() 和 rangeCheck() 的协同设计。

? 终极建议:把省下的重复实现时间,用于学习 ArrayList 如何与 Arrays.sort() 协同优化、如何配合 Stream 实现惰性求值,或探究 List.of() 不可变集合的内存布局——这才是真正提升 Java 工程能力的正道。

Napkin AI
Napkin AI

Napkin AI 可以将您的文本转换为图表、流程图、信息图、思维导图视觉效果,以便快速有效地分享您的想法。

下载

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
eclipse教程
eclipse教程

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

196

2023.06.14

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

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

807

2023.07.24

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

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

624

2023.11.02

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等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

181

2024.02.23

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

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

153

2024.02.23

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

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

117

2025.10.10

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

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

158

2025.10.10

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

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

120

2025.10.15

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 81.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号