0

0

在Java里集合容量和性能有什么关系_Java扩容成本解析

P粉602998670

P粉602998670

发布时间:2026-02-02 15:22:58

|

591人浏览过

|

来源于php中文网

原创

ArrayList扩容慢是因为每次扩容需O(n)时间复制元素,插入1万元素未设初容会触发约12次扩容并产生大量临时数组,加剧GC压力;设初容可避免扩容。

在java里集合容量和性能有什么关系_java扩容成本解析

ArrayList扩容为什么慢?一次add可能触发多次复制

ArrayList底层是数组,容量固定;一旦add()时发现size + 1 > elementData.length,就必须扩容。默认从10开始,每次按1.5倍增长(10→15→22→33→49…),每次扩容都要调用Arrays.copyOf()把老数组所有元素拷到新数组——这是纯CPU密集型操作,时间复杂度O(n)。

  • 插入1万个元素,未设初容:约经历12次扩容,产生12个临时数组对象,GC压力陡增
  • 设初容为10000:零扩容,无拷贝,内存连续,缓存命中率更高
  • JDK 1.7+优化了“懒初始化”:无参构造new ArrayList()初始数组长度为0,第一次add()才分配10个槽位,但该优化不改变后续扩容成本

HashMap初始容量怎么算?别直接写16或100

HashMap不是简单“够用就行”,它的性能强依赖哈希分布质量。默认负载因子0.75,意味着容量×0.75就是触发扩容的阈值。如果预估存1000个键值对,直接传1000会出问题——构造器会把它向上取整到最近的2的幂(如1000→1024),但1024 × 0.75 = 768,刚插769个就扩容,白浪费空间。

  • 正确公式:(int) Math.ceil(expectedSize / 0.75) → 1000 / 0.75 ≈ 1333.33 → 向上取整得1334
  • 再由HashMap内部自动转为2的幂:1334 → 实际初始化容量为2048(2¹¹)
  • 验证:2048 × 0.75 = 1536 > 1000,确保全程不扩容
  • 反例:传100,实际变128;传1000,实际变1024 → 都会导致过早扩容

哪些场景必须算容量?哪些可以忽略?

不是所有集合都要精打细算,关键看是否满足“可预估 + 高频创建 + 批量写入”三要素。

  • 必须算:批量读DB后封装List(已知查出5000条)、消息队列消费端聚合事件、定时任务汇总日志记录
  • 可以忽略:工具类里临时拼接几个字符串的ArrayList、单次请求中只存2–3个配置项的HashMap
  • 容易踩坑:在for循环内反复新建小集合(如每个订单建一个new ArrayList()),看似小,但QPS高时minor GC频率飙升
  • 并发场景额外注意:即使容量设对,HashMap仍线程不安全,高并发put可能引发死循环(JDK 7)或数据丢失(JDK 8+),该换ConcurrentHashMap就换

扩容不只是速度问题,它悄悄吃掉你的GC和内存

频繁扩容产生的旧数组(如10→15→22…中的10、15、22这些byte[])生命周期极短,全进年轻代,很快触发minor GC。更危险的是大集合:ArrayList存大量String或DTO,扩容生成的大数组可能直接晋升老年代,诱发Full GC。

千面数字人
千面数字人

千面 Avatar 系列:音频转换让静图随声动起来,动作模仿让动漫复刻真人动作,操作简单,满足多元创意需求。

下载

立即学习Java免费学习笔记(深入)”;

  • 一个10MB的byte[]扩容一次,就多一个10MB临时对象,哪怕只活几毫秒,也加重GC扫描负担
  • 内存碎片风险:连续多次扩容导致堆内存中散布多个大小不一的短期数组,降低内存利用率
  • 真实案例:某支付系统在大促时young GC耗时从5ms涨到80ms,定位发现是日志聚合模块未设ArrayList初容,单次请求生成30+个未预估集合

容量不是玄学参数,它是你对数据规模最基础的承诺。算错一次影响不大,但批量、高频、长期运行的服务里,漏掉这个细节,就像在高速路上一直开双闪——不致命,但让所有优化都事倍功半。

相关文章

数码产品性能查询
数码产品性能查询

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

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

523

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1505

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

698

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

650

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

174

2025.07.29

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

45

2026.02.02

热门下载

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

精品课程

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

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.3万人学习

Java 教程
Java 教程

共578课时 | 55.8万人学习

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

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