怎么利用ensureCapacity手动触发扩容以提升大规模写入性能

星枫姑娘_9188

星枫姑娘_9188

2026-04-04

163人浏览

原创

ensurecapacity 不是扩容操作,而是预检查并按需分配更大底层数组空间;它不改变 size(),仅确保后续写入不频繁触发 o(n) 扩容复制。

怎么利用ensurecapacity手动触发扩容以提升大规模写入性能

为什么 ensureCapacity 不能“手动触发扩容”

它根本不是扩容操作,只是预检查并提前分配底层数组空间——如果当前容量不足,就新建一个更大的数组,把旧元素复制过去;如果够用,什么也不做。很多同学以为调用它就能“强制扩容”,结果发现 size() 没变、capacity() 也没立刻增长(比如在 ArrayList 中),其实是误读了语义。

真正影响写入性能的,是频繁扩容引发的多次数组复制。一次 add() 可能触发扩容,而扩容成本是 O(n),10 万次追加若触发 15 次扩容,光复制就可能多跑几百万次元素移动。

  • ensureCapacity 必须在写入前调用,且传入的是「最小所需容量」,不是“想扩多少就扩多少”
  • 对空 ArrayList,默认初始容量是 10;若你知道要塞 20000 个元素,直接 new ArrayList(20000) 比反复 ensureCapacity 更干净
  • 调用后不会清空或重置已有数据,但也不会改变 size() —— 它只管底层数组,不管逻辑长度

ensureCapacity 的正确调用时机和参数计算

适用于你明确知道最终规模,且写入是集中、分批、非流式的场景。例如:解析一个已知行数的 CSV 文件,或批量处理数据库查出的 List<record></record>。

错误做法是边 add 边 check、每 1000 次调一次 ensureCapacity;正确做法是在循环前一次性算好上限:

int expectedSize = 15000;
List<string> list = new ArrayList();
list.ensureCapacity(expectedSize); // ← 这里才起作用
for (int i = 0; i <ul>
<li>参数应 ≥ 预期最大 <code>size()</code>,不要减去当前 <code>size()</code>(<code>ensureCapacity</code> 接收的是总容量下限)</li>
<li>如果数据源本身有 <code>size()</code> 方法(如 <code>Collection</code>、数组),直接用它;否则宁可略高估,也不要低估</li>
<li>对 <code>StringBuilder</code> 同理:<code>ensureCapacity(1024 * 1024)</code> 可避免字符串拼接时反复 realloc,但前提是确定最终字符数</li>
</ul>
<h3>不同容器的 <code>ensureCapacity</code> 行为差异</h3>
<p>不是所有集合都有这个方法。只有底层基于数组、且扩容代价显著的类才提供它,典型就是 <code>ArrayList</code> 和 <code>StringBuilder</code>。而 <code>LinkedList</code>、<code>ConcurrentLinkedQueue</code> 或 <code>HashMap</code> 都没有——它们的扩容机制完全不同,或根本不需要连续内存。</p>
<ul>
<li>
<code>ArrayList.ensureCapacity(int)</code>:调整内部 <code>Object[]</code> 数组,策略是“至少达到参数值”,实际分配可能更大(如 JDK 17 中会按 1.5 倍增长规则向上取整)</li>
<li>
<code>StringBuilder.ensureCapacity(int)</code>:调整内部 <code>char[]</code>,行为类似,但注意它还受 <code>toString()</code> 缓存影响,扩容后旧缓存失效</li>
<li>
<code>Vector</code> 也有该方法,但它自带同步开销,大规模写入时通常不如 <code>ArrayList</code> + 预分配高效</li>
</ul>
<h3>容易被忽略的边界和副作用</h3>
<p>最常踩的坑,是以为调用 <code>ensureCapacity</code> 就万事大吉,结果发现 GC 压力反而上升,或者并发写入时出现诡异问题。</p>
<ul>
<li>过度预分配浪费内存:申请 100 万容量却只写 10 万个对象,堆里多占几 MB 无用数组,GC pause 时间可能明显增加</li>
<li>多线程下不安全:即使你提前 <code>ensureCapacity</code>,多个线程同时 <code>add()</code> 仍需同步,该方法本身不提供线程保护</li>
<li>某些框架封装后屏蔽了该方法:比如 MyBatis 的 <code>ResultHandler</code> 回调中返回的 <code>List</code> 可能是不可变或代理对象,调用 <code>ensureCapacity</code> 会抛 <code>UnsupportedOperationException</code>
</li>
</ul>
<p>真要压榨写入性能,优先级应该是:确认规模 → 构造时指定初始容量 → 避免中间截断/清空/转数组等隐式扩容操作 → 最后才考虑 <code>ensureCapacity</code> 补漏。它是个保险栓,不是加速器。</p></string>
数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10917

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8042

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6972

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1184

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1416

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2869

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20151

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1255

8

热门下载

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

精品课程

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

共6课时 | 54.7万人学习

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

共89课时 | 133.9万人学习