news 2026/5/23 12:10:52

ArrayList 扩容机制详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArrayList 扩容机制详解

ArrayList 扩容机制详解

ArrayList 是 Java 用得最多的 List,底层是动态数组。理解扩容机制能避免一些性能问题。

1. 底层结构

transientObject[]elementData;privateintsize;

// 默认初始容量
private static final int DEFAULT_CAPACITY = 10;

注意:new ArrayList() 的时候,elementData 是一个空数组,不是长度 10 的数组。第一次 add 的时候才扩容到 10。 ```java private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }

2. add 操作

publicbooleanadd(Ee){ensureCapacityInternal(size+1);elementData[size++]=e;returntrue;}privatevoidensureCapacityInternal(intminCapacity){ensureExplicitCapacity(calculateCapacity(elementData,minCapacity));}privatestaticintcalculateCapacity(Object[]elementData,intminCapacity){if(elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA)returnMath.max(DEFAULT_CAPACITY,minCapacity);// 第一次扩到 max(10, 1)returnminCapacity;}privatevoidensureExplicitCapacity(intminCapacity){modCount++;if(minCapacity-elementData.length>0)grow(minCapacity);// 需要扩容}

3. grow 扩容

privatevoidgrow(intminCapacity){intoldCapacity=elementData.length;intnewCapacity=oldCapacity+(oldCapacity>>1);// 1.5 倍if(newCapacity<minCapacity)newCapacity=minCapacity;if(newCapacity>MAX_ARRAY_SIZE)newCapacity=hugeCapacity(minCapacity);elementData=Arrays.copyOf(elementData,newCapacity);}

扩容为原来的 1.5 倍(oldCapacity + oldCapacity / 2)。

Arrays.copyOf底层调用 System.arraycopy,是 native 方法,内存拷贝效率很高。

4. 指定初始容量

如果知道大概要放多少元素,指定初始容量可以避免多次扩容:

// 知道要放 1000 个元素List<String>list=newArrayList<>(1000);

不指定的话:10 → 15 → 22 → 33 → 49 → 73 → 109 → 163 → 244 → 366 → 549 → 823 → 1234。中间扩容了 12 次!

每次扩容都要数组拷贝,频繁扩容会影响性能。特别是数据量大的时候,一次扩容拷贝几万个元素,耗时不少。

5. 批量添加

// addAll 效率更高List<String>list=newArrayList<>(existingList.size());list.addAll(existingList);// 比 for 循环 add 好,因为内部做了容量预检查

6. trimToSize

list.trimToSize();// 缩小到实际 size

大量删除后数组还有冗余空间,可以用 trimToSize 回收内存。

7. 数组和链表的选择

ArrayList 随机访问 O(1),中间插入删除 O(n)。
LinkedList 随机访问 O(n),头尾操作 O(1)。

绝大多数场景 ArrayList 性能更好,因为:CPU 缓存对连续内存布局友好,随机访问效率远高于链表的指针跳转。除非大量头尾操作,否则优先用 ArrayList。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 12:01:09

OpenClaw 一键部署全攻略|环境搭建 + 配置 + 启动,一步到位

OpenClaw&#xff08;小龙虾&#xff09;Windows 一键部署保姆级教程 | 10 分钟养出你的数字员工&#xff08;2026 最新版&#xff09; 前言 2026 年热门的开源 AI 智能体 OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub 星标超 28 万&#xff0c;凭借本地运…

作者头像 李华
网站建设 2026/5/23 11:59:28

ESP32音频录音终极指南:从硬件连接到高质量WAV文件生成

ESP32音频录音终极指南&#xff1a;从硬件连接到高质量WAV文件生成 【免费下载链接】esp32_SoundRecorder ESP32 Sound recorder with simple code in arduino-esp32. (I2S interface) 项目地址: https://gitcode.com/gh_mirrors/es/esp32_SoundRecorder ESP32音频录音项…

作者头像 李华
网站建设 2026/5/23 11:57:08

三分钟掌握Bifrost:跨平台三星官方固件下载与解密终极指南

三分钟掌握Bifrost&#xff1a;跨平台三星官方固件下载与解密终极指南 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 还在为找不到三星官方固件而发愁吗&#x…

作者头像 李华
网站建设 2026/5/23 11:53:29

OpCore Simplify:黑苹果OpenCore EFI自动化配置的智能解决方案

OpCore Simplify&#xff1a;黑苹果OpenCore EFI自动化配置的智能解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在复杂的黑苹果安装过程中&…

作者头像 李华
网站建设 2026/5/23 11:53:11

LSTM股价预测实战:金融时序建模与工程落地全解析

1. 项目概述&#xff1a;用LSTM神经网络预测谷歌股价&#xff0c;不是玄学&#xff0c;是可复现的时序建模实践 “Google Stock Predictions using an LSTM Neural Network”——这个标题乍看像一篇学术论文&#xff0c;但实际是一条被反复验证、真正能跑通的工业级时间序列预测…

作者头像 李华