问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

HashMap的初始容量和加载因子

发布网友 发布时间:2022-12-26 16:14

我来回答

1个回答

热心网友 时间:2023-10-16 07:00

原文地址: https://xeblog.cn/articles/26

通过查看 HashMap 的源码可以得知其默认的初始容量为 16 ,默认的加载因子为 0.75 。

一般情况下都是通过这三种构造方法来初始化 HashMap 的。通过默认的无参构造方法初始化后 HashMap 的容量就是默认的16,加载因子也是默认的0.75;通过带参数的构造方法可以初始化一个自定义容量和加载因子的 HashMap 。通常情况下,加载因子使用默认的0.75就好。

HashMap 的容量要求必须是2的N次幂,这样可以提高散列的均匀性,降低 Hash 冲突的风险。但是容量可以通过构造方法传入的,如果我传入一个非2次幂的数进去呢?比如3?传进去也不会干嘛呀,又不报错。。。哈哈哈哈。
是的,不会报错的,那是因为 HashMap 自己将这个数转成了一个最接近它的2次幂的数。这个转换的方法是 tableSizeFor(int cap) 。

这个方法会将传入的数转换成一个2次幂的数,比如传入的是3,则返回的是4;传入12,则返回的是16。

加载因子和 HashMap 的扩容机制有着非常重要的联系,它可以决定在什么时候才进行扩容。 HashMap 是通过一个阀值来确定是否扩容,当容量超过这个阀值的时候就会进行扩容,而加载因子正是参与计算阀值的一个重要属性,阀值的计算公式是 容量 * 加载因子 。如果通过默认构造方法创建 HashMap ,则阀值为 16 * 0.75 = 12 ,就是说当 HashMap 的容量超过12的时候就会进行扩容。

这是 HashMap 的 putVal(...) 方法的一个片段, put(...) 方法其实就是调用的这个方法, size 是当前 HashMap 的元素个数,当元素个数+1后超过了阀值就会调用 resize() 方法进行扩容。

加载因子在一般情况下都最好不要去更改它,默认的0.75是一个非常科学的值,它是经过大量实践得出来的一个经验值。当加载因子设置的比较小的时候,阀值就会相应的变小,扩容次数就会变多,这就会导致 HashMap 的容量使用不充分,还没添加几个值进去就开始进行了扩容,浪费内存,扩容效率还很低;当加载因子设置的又比较大的时候呢,结果又很相反,阀值变大了,扩容次数少了,容量使用率又提高了,看上去是很不错,实际上还是有问题,因为容量使用的越多, Hash 冲突的概率就会越大。所以,选择一个合适的加载因子是非常重要的。

通过默认构造方法创建一个 HashMap ,并循环添加13个值

当添加第1个值后,容量为16,加载因子为0.75,阀值为12

当添加完第13个值后,执行了扩容操作,容量变为了32,加载因子不变,阀值变为了24

创建一个初始容量为12(非2次幂数)的 HashMap ,并添加1个值

创建一个初始容量为2的 HashMap ,并添加2个值

当添加完第1个值后,容量为2,加载因子为0.75,阀值为1

当添加完第2个值后,执行了扩容操作,容量变为4,加载因子为0.75,阀值为3

创建一个初始容量为2、加载因子为1的 HashMap ,并添加2个值

当添加完第1个值后,容量为2,加载因子为1,阀值为2

当添加完第2个值后,并没有执行扩容操作,容量、加载因子、阀值均没有变化
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 苹果14画线工能在哪里画 如何去除口中的大蒜味 凯迪拉克旅行版轿车什么时候上市 2022凯迪拉克ct6那款有后轮转向 凯迪拉克XTS车玻璃价格多少 凯迪拉克CT6插电混动上海车展发布未来将国产 凯迪拉克轿车有哪几款? ⇃瓜怎么炒保绿? win10哪个系统装博途稳定 东北干豆腐怎么做这样炒一下就很好吃 人参炖鸽子有哪些功效与作用 文言文盖 盍各   [hé gè]什么意思?近义词和反义词是什么?英文翻译是什么? 盍稍留乎文言文翻译 盍的拼音 茶峒与歌岛 索引无效原因 杨梅禁忌人群杨梅禁忌人群有哪些 猪劲肉是猪的哪个部位 冰箱噪音大嗡嗡作响怎么解决 性能优化总结-数据结构优化 面部浮肿怎么快速消除 36条中国最佳自驾游线路 南宁市金科博翠天宸到埌东站多少公里 西安哪里有卖的,香辣竹笋 榆次金科2022开工面积 南宁金科有几个楼盘 显卡容量怎么选择 复合地板和地板砖哪个好 优缺点对比分析 优势和亮点 td-lte怎样录屏? LTE手机怎么录屏,我是一个小主播,最近换了LTE手机,但很多录屏软件都不能用 离四川乐山最近的机场除了成都离四川乐山最近的机场除了成都还有哪? 乐山到哈尔滨的飞机有直飞的吗? 草图大师su如何贴材质?SketchUp怎么给模型贴材质? 怎么把su材质导出 华为路由器2.4G频率与5G频率有什么区别 请问SA和NSA是指什么? 孙武传文言文 孙子传记述了什么一事?