使用 HashMap 存一万条数据,构造时传 10000 还会触发扩容吗?

”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“ 构造10000 /** * Constructs an empty <tt>HashMap</tt> with the specified initial * capacity and the default load factor (0.75). * * @param initialCapacity the initial cap... 阅读详情

问题

  向 HashMap 中存 10000 条数据,初始化时,构造方法传值 10000,会触发扩容吗?

Map<String,String> map = new HashMap<>(10000);

分析

乍一看

  肯定会触发扩容呀,因为 HashMap 中有个负载因子默认为 0.75,就是说存储的数量超过容量的 75% 就会触发扩容,put 到后 25% 的数据时,肯定就会触发扩容。但事实真是这样吗?源码中有我们想知道的一切,真相只有一个。

分析源码

HashMap 的初始化

  在 HashMap 中,提供了一个指定初始容量的构造方法 HashMap(int initialCapacity),这个方法再通过 DEFAULT_LOAD_FACTOR 调用 HashMap 另一个构造方法,初始化 loadFactor 为 0.75。

public HashMap(int initialCapacity) {
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap(int initialCapacity, float loadFactor) {
  	......
    this.loadFactor = loadFactor;
    this.threshold = tableSizeFor(initialCapacity);
}

  构造方法初始化了两个成员变量 threshold 和 loadFactor,其中 threshold 就是用来存储触发 HashMap 扩容的阈值,也就是说,当 HashMap 存储的数据量达到 threshold 时,就会触发扩容。
  从改造方法中可以看出,threshold 并没有直接使用传入的 initialCapacity 作为扩容阈值,而是通过 tableSizeFor 方法处理后再赋值给 threshold。

static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

  这啥呀?看不懂也没关系,我来解释。tableSizeFor 的作用就是寻找大于 cap 的 2 的整数次方,例如如果传入 10,经过 tableSizeFor 处理后返回 16。至于为什么这样做,不在此处详细讨论。

回归正题

  还有一个问题,一直在说 threshold 是触发扩容的阈值,即 (initialCapacity * loadFactor),但是我们再构造方法中使用 tableSizeFor 初始化 threshold,并没有用到 loadFactor,其实这一步被移交给 resize 方法实现了,因为我们并没有在构造方法中初始化哈希表数组,扩容阈值 threshold = initialCapacity * loadFactor,这一步在 resize 中完成。
  如果我们从外部传递进来 10000 初始化 initialCapacity ,实际上经过 tableSizeFor 方法处理之后,最终 threshold 就会变成 2 的 14 次幂 16384,再在 resize 方法中乘上负载因子 0.75,实际在不触发扩容的前提下,可存储的数据容量是 12288(16384 * 0.75),用来存放 10000 条数据,绰绰有余,所以并不会触发扩容。

initialCapacity

  关于如何选择 initialCapacity,我们看看阿里巴巴 Java 开发规范,规范要求在初始化 HashMap 时,必须指定 initialCapacity,因为这样可以减少 resize 次数,提高程序效率。因为 threshold = initialCapacity * loadFactor,所以 initialCapacity = (需要存储元素个数 / loadFactor) + 1。
在这里插入图片描述

示例

  想要使用 HashMap 存放 10000 条数据,应该设置 initialCapacity = 10000 / 0.75 + 1 = 13334,然后哈希表容量会被 tableSizeFor 方法调整到 16384(2^14),threshold = 16384 * 0.75 = 12288 足够存储 10000 条数据而不会触发扩容。

总结

  • HashMap 构造方法传递的 initialCapacity 实际表示哈希表的容量,不代表扩容阈值。
  • 构造方法传递的 initialCapacity,会被 tableSizeFor 方法调整为大于它的 2 的整数次方。
  • 如果使用 initialCapacity 进行初始化,HashMap 是否扩容,由 threshold 决定,扩容阈值 threshold = initialCapacity * loadFactor。
  • 在初始化 HashMap 时,必须指定 initialCapacity 来提升效率,initialCapacity = (需要存储元素个数 / loadFactor(默认0.75)) + 1。
2025华为OD面试手撕代码真题目录及面试八股文 本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备 阅读详情

相关推荐

保姆级教程:用MATLAB搞定运动模糊图片修复(附完整代码与避坑指南)

本文提供了一份详细的MATLAB运动模糊图片修复教程,涵盖盲复原、图像复原等核心技术。通过傅里叶变换和Radon变换分析模糊参数,对比逆滤波、维纳滤波和Lucy-Richardson算法效果,并附完整代码与避坑指南,帮助用户实现专业级图像处理。

weixin_26765363的博客 230

面试官:准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?

// 预计存入 1w 条数据,初始化赋值 10000,避免 resize。 HashMap<String,String> map = new HashMap<>(10000) // for (int i = 0; i < 10000; i++) Java 集合的扩容 HashMap 算是我们最常用的集合之一,虽然对于 Android 开发者,Google 官方推荐了更省内存的 SparseArray 和 ArrayMap,但是 HashMap 依然是最常用的...

小小时光 887

AltiumDesigner相同模块复用操作

AltiumDesigner相同模块复用操作框选已布局好的A电路,作为复用模块创建Room同样的操作,框选C电路,然后也创建Room查看A电路的Chanel Offset显示设置复制Channel Offset查看B电路的Channel Offset复制A电路的Channel Offset到C电路Room格式的复制 框选已布局好的A电路,作为复用模块 创建Room 同样的操作,框选C电路,然后也创建Room 查看A电路的Chanel Offset 框选A模块的,然后点右下角的菜单——PCB——PCB

weixin_41947101的博客 5960

Java 500M的表,约1千万的数据放在HashMap里面大约占用内存多大?给多大内存最保险?...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34266504的博客 1991

用户消费行为分析(MapReduce实现,Hive分析)

一、题目要求 数据来自CDNow网站的一份用户购买CD明细,本数据集共有 6 万条 左右数据,数据为 CDNow 网站 1997年1月至1998年6月的用户行为 数据

紫烟的博客 3013

告别理论纠结!用ADS和Sigrity玩转电源完整性:从PDN阻抗优化到芯片供电仿真全流程

本文详细介绍了如何利用ADS和Sigrity工具进行电源完整性(PI)分析,从PDN阻抗优化到芯片供电仿真的全流程。通过频域、直流和时域分析,工程师可以精确评估电源网络性能,优化设计以避免电压波动和系统失效。文章还提供了ADS和Sigrity PowerDC的实战操作指南,帮助读者掌握现代PI设计的核心技术。

weixin_33749242的博客 310

蚂蚁金服Java研发岗二面:说说HashMap 中的容量与扩容实现

JDK1.8 中 HashMap 的底层实现,我相信大家都能说上来个 一二,底层数据结构 数组 + 链表(或红黑树) ,源码如下 /** *数组 */ transientNode<K,V>[]table;/** *链表结构 */ staticclassNode<K,V>implementsMap.Entry<K,V>{ finalinthash; finalKkey; Vvalue;Node<K...

文章中资料均可获取,有需要请添加yunduoa2019即可 717

知识图谱中的 Ontology(本体论)

1980年,本体论(Ontology)哲学概念“本体”被引入到人工智能领域用来刻画知识。本体概念模型、明确、形式化、共享。本体是实体存在形式的描述,往往表示为一组概念定义和概念之间的层级关系,本体框架形式树状结构,通常被用来为知识图谱定义schema。如人、公司、车等都可以在具体场景下称为本体。Ontology是(特定领域)信息组织的一种形式,是领域知识规范的抽象和描述,是表达、共享、重用知识的方法。Ontology。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2030

HashMap源码注解和相关面试问题汇总答疑

整合网上摘抄的和自己的理解 一、相关参数 1、默认初始容量 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 必须是2的n次幂 2、负载因子 DEFAULT_LOAD_FACTOR = 0.75f; 3、扩容阀值 int threshold; (容量capacity*负载因子load factor),当...

ggf的专栏 272

什么是垂直同步?电脑快速消除屏幕撕裂与提升游戏性能的方法 垂直同步、游戏画面撕裂、游戏优化、VSync、FPS、FreeSync、G-Sync、显卡驱动更新、游戏画质、输入延迟

看这张动图,左边的画面出现了明显“切开”的断层现象,而右边画面非常流畅,没有撕裂。这正是「垂直同步」开关的区别。:每秒生成多少帧图像。比如 60FPS 表示一秒钟显示 60 张图片。刷新率(Refresh Rate):显示器每秒刷新几次画面,单位是赫兹(Hz)。60Hz 表示每秒刷新 60 次。参数说明FPS显卡渲染速度(逻辑帧率)刷新率显示器的显示频率(物理限制)当 FPS 高于刷新率时,显卡渲染的画面来不及被显示器显示,导致撕裂。屏幕撕裂(Screen Tearing)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1347

【模型之美】3、文本聚类与智能摘要,让AI帮你做个总结

在信息过载时代,文本聚类与摘要技术成为关键工具。本文提出了一种结合OpenAI Embedding与传统机器学习的方法,实现从文本预处理到智能分析的完整流程。技术方案分为三阶段:1)通过Embedding将文本转化为语义向量;2)采用K-Means等算法进行无监督聚类;3)利用大模型生成可解释的标签和摘要。实验证明,该方法能有效提升信息处理效率,如在新闻聚合系统中自动分类10,000篇文章,准确率较传统方法提高15%。方案包含实用代码示例,涵盖文本清洗、向量化、聚类优化等关键技术细节,可应用于对话记忆、舆情

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1440

面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“

//预计存入1w条数据,初始化赋值10000,避免 resize。 HashMap<String,String>map=newHashMap<...

承香墨影的博客 3659

AD9914数字斜坡模式使用

类似的,如果DRG输出处于负斜率斜坡中间,DRCTL引脚由逻辑0变为逻辑1,那么DRG会立即切换成正斜率参数,恢复在两个限值之间振荡输出。当两个非驻留位同时设置时,每次DRG输出达到编程设定的上限值或下限值后(假定DRG过输出使能位(0x01[13])已设置),DROVER信号会产生一个正脉冲(两个DDS时钟周期)。不过,在非驻留操作中,DRG输出不一定保持在上下限值。例如,设置数字斜坡非驻留高位,则当达到上限值时,DRG会自动(立即)跳到下限值(这一过程并非以斜坡方式返回下限值,而是直接跳至下限值)。

wangjie36的博客 3864

准备用HashMap存1W条数据,构造时传10000还会触发扩容吗?存1000呢?

准备用HashMap存1W条数据,构造时传10000还会触发扩容吗?存1000呢?

Knight 1376

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

面试官:"准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?"

// 预计存入 1w 条数据,初始化赋值 10000,避免 resize。 HashMap<String,String> map = new HashMap<>(10000) // for (int i = 0; i < 10000; i++) Java 集合的扩容 HashMap 算是我们最常用的集合之一,虽然对于 Android 开发者,Google 官方推...

good575654643的博客 5829

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HashMap存1000条数据,构造时传多少才能让HashMap不需要动态扩容?

既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。

2301_82242844的博客 899

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用容量 10000 的HashMap 存9000条数据,会触发扩容吗 ?

面试官:使用容量 10000 的HashMap 存9000条数据,会触发扩容吗 ? 先说结论,不会! 众所周知,Hashmap有负载因子为0.75,达到负载因子就会触发扩容,但这是无参构造即初始容量为16的Hashmap,而这里容量是10000,使用了有参构造的Hashmap,不一样。

机械工程跑路哥 1493

面试官:“准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?“

https://juejin.im/post/6844903983748743175 https://www.jianshu.com/p/6d7151c2a700 //预计存入1w条数据,初始化赋值10000,避免resize。 HashMap<String,String>map=newHashMap<>(10000) //for(inti=0;i<10000;i++) 复制代码 Java 集合的扩容 Ha...

yb223731的博客 1039

面试官:_准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?_

看到这篇文章的人不知道有多少是和我一样的Android程序员。35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。

2401_86022640的博客 734

hashmap扩容_涉及源码:准备用HashMap存1W条数据,构造时传10000还会触发扩容吗?存1000呢?...

本篇文章先写的一下涉及到的hashmap的一点源码的东西,后期有时间写出完整的hashmap的原码过程,19年冬天的时候完成的一步一步的看了一下jdk1.8的hashmap的源码和courrenthashmap的源码,先根据一个小需求简单介绍一下!HashMap真的是用处非常广泛,首先,费话不多说,我自己打开了idea,并进入HashMap的构造方法可见,HashMap提供了一个指定初始容量的构造...

weixin_39819661的博客 481

hashmap存多少条数据_准备用 HashMap 存储 1w 条数据,构造方法传入 1w 进去会触发扩容吗?...

通过构造方法传入 1w,也就是 Map map = new HashMap(10000),想要知道它是否会扩容,那就看这个构造方法做了啥?public HashMap(int initialCapacity) {this(initialCapacity, DEFAULT_LOAD_FACTOR);}调用了自身的另一个构造方法public HashMap(int initialCapacity, f...

weixin_30444697的博客 1162

table高度改变时触发什么事件_面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“...

阖(xin)家(jing)团(dan)圆(zhan)的春节假期结束了,我们需要点技术干货充实下自己~本篇文章介绍了集合扩容的相关干货,5分钟时间即可通读全文~//预计存入1w条数据,初始化赋值10000,避免 resize。HashMapmap=newHashMap<>(10000)//for(inti=0;iJava 集合的扩容HashMap 算是我...

weixin_39574287的博客 83

table高度改变时触发什么事件_面试官:"准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?"...

Java 集合的扩容HashMap 算是我们最常用的集合之一,虽然对于 Android 开发者,Google 官方推荐了更省内存的 SparseArray 和 ArrayMap,但是 HashMap 依然是最常用的。我们通过 HashMap 来存储 Key-Value 这种键值对形式的数据,其内部通过哈希表,让存取效率最好时可以达到 O(1),而又因为可能存在的 Hash 冲突,引入了链表和红黑树...

weixin_39797324的博客 75
上一篇: 浅析 Comparable 和 Comparator
下一篇: Java 为什么不支持泛型数组?
ali48
博客等级 码龄6年 31粉丝 117原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值