当前位置: 首页 > news >正文

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。

http://www.zskr.cn/news/1355715.html

相关文章:

  • 新手开发者首次接触 Taotoken 控制台的功能导览与核心操作
  • 2026 西安名表回收推荐,五大平台实测对比,高价变现全攻略 - 李宏哲1
  • WinCC VBS脚本变量替换避坑指南:为什么你的‘交叉索引’里找不到某些变量?
  • 三星固件下载神器Bifrost:终极跨平台解决方案,三分钟学会官方固件下载与解密
  • 2026年5月最新邢台桥西黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • xtensor-stack 开源组织全解析:背景、核心项目、使用教程
  • 2026年5月最新邢台清河黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • ESP32音频录音终极指南:从硬件连接到高质量WAV文件生成
  • 2026年5月最新锡林郭勒盟锡林浩特黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • Hermes Agent项目中集成Taotoken多模型服务的配置指南
  • 2026年5月最新邢台任县黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 解决Claude Code频繁封号与Token不足问题转向稳定聚合平台
  • 2026 最新claude-code 实用技巧指南 看这一篇就够了
  • 通过 TaoToken CLI 工具一键配置多开发环境下的模型调用密钥
  • DDrawCompat终极指南:三步让老游戏在Windows 10/11上流畅运行
  • 2026年5月最新邢台威县黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • Windows 11如何轻松安装Android应用?WSA Toolbox实用指南
  • Fooocus AI绘图软件保姆级安装教程:从下载到出图,附赠打包好的模型文件
  • 2026年5月最新新疆福海黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 告别Bowtie2!用Minimap2搞定FASTQ到BAM的保姆级流程(含最新参数详解)
  • 终极指南:如何轻松解包网易游戏NPK资源文件
  • 小型团队如何利用Taotoken统一管理多模型API成本
  • 2026年5月最新松原长岭黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 如何用Happy Island Designer免费打造你的梦幻岛屿:终极完整指南
  • 2026脑机接口:技术突破与产业爆发
  • 2026年5月最新通化二道江黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 3步搞定老iPhone降级:LeetDown让你的iPhone 5s/6焕发新生
  • 基于AM62x核心板的微电网智能化改造:异构多核驱动与边缘计算实践
  • 2026年5月最新通化辉南黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 2026 西安名表回收哪里更专业?专业门店与避坑指南 - 李宏哲1