Java集合为什么经常需要指定初始容量_初始容量设置原因说明
发布时间 - 2025-12-30 00:00:00 点击率:次设置初始容量可减少扩容开销、提升性能并降低GC压力;ArrayList默认容量10,HashMap默认16且需为2的幂;推荐公式为initialCapacity = (int) Math.ceil(expectedSize / 0.75)。
Java集合(如 ArrayList、HashMap)设置初始容量,核心是为了减少扩容带来的性能开销和内存浪费。
避免频繁扩容导致的数组复制
像 ArrayList 底层是动态数组,当元素数量超过当前容量时,会创建一个更大的新数组(通常是1.5倍),再把老数据逐个复制过去。这个过程涉及内存分配 + 遍历拷贝,时间复杂度是 O(n)。如果一开始就知道大概要存 1000 个元素,却用默认容量 10 初始化,中间可能要扩容十几次,白白消耗 CPU 和 GC 压力。
-
ArrayList默认初始容量是 10;HashMap默认是 16(且要求是 2 的幂) - 每次扩容都要重新哈希(
HashMap)或复制元素(ArrayList) - 尤其在循环中反复
add()时,不设初始容量影响更明显
提升 HashMap 查找与插入效率
HashMap 的性能高度依赖负载因子和初始容量。容量太小 → 冲突增多 → 链表/红黑树变长 → 查找退化为 O(n);容量过大 → 内存占用高,且遍历桶数组更慢。合理设置初始容量(结合预估 size 和默认负载因子 0.75),能让哈希分布更均匀
,减少碰撞,保持平均 O(1) 操作。
- 推荐公式:
initialCapacity = (int) Math.ceil(expectedSize / 0.75) - 构造时传入的容量会被自动“向上取整到 2 的幂”,比如传 100,实际初始化为 128
- 如果明确知道 size 是 32,直接传 32 比用默认 16 更省一次扩容
降低 GC 压力和内存碎片
频繁扩容会产生大量短期存活的旧数组对象(比如 10→15→22→33…),这些对象很快被丢弃,但会加重年轻代 GC 负担。尤其在高并发或批量处理场景(如读取万条数据库记录转成 List),一次性指定合理初始容量,能显著减少临时对象数量和内存抖动。
- 服务端应用中,一个请求里新建几十个未设初容的 ArrayList,容易引发 minor GC
- 大对象(如 byte[] 数组)扩容还可能直接进入老年代,加剧 Full GC 风险
- 内存对齐和连续分配也更友好,间接提升缓存命中率
基本上就这些。不是所有场景都必须算,但对性能敏感、数据量可预估、或高频创建集合的地方,花几秒想一下初始容量,往往比后期调优更简单有效。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅谈javascript alert和confirm的美化
如何快速搭建二级域名独立网站?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel如何实现用户密码重置功能?(完整流程代码)
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
如何基于云服务器快速搭建网站及云盘系统?
Android仿QQ列表左滑删除操作
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Python文件流缓冲机制_IO性能解析【教程】
详解MySQL数据库的安装与密码配置
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何挑选高效建站主机与优质域名?
如何在Windows服务器上快速搭建网站?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
教你用AI将一段旋律扩展成一首完整的曲子
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
如何用5美元大硬盘VPS安全高效搭建个人网站?
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
打造顶配客厅影院,这份100寸电视推荐名单请查收
简单实现jsp分页
Laravel如何创建自定义Artisan命令?(代码示例)
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel如何配置和使用缓存?(Redis代码示例)
中山网站推广排名,中山信息港登录入口?
音乐网站服务器如何优化API响应速度?
如何实现建站之星域名转发设置?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
如何在万网ECS上快速搭建专属网站?
Android滚轮选择时间控件使用详解
浅述节点的创建及常见功能的实现
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
JavaScript常见的五种数组去重的方式
EditPlus中的正则表达式实战(6)
如何在万网开始建站?分步指南解析
香港服务器租用每月最低只需15元?
linux top下的 minerd 木马清除方法
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何做网站制作流程,*游戏网站怎么搭建?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
打开php文件提示内存不足_怎么调整php内存限制【解决方案】

