被问懵了:什么是负载因子?为什么是0.75?

虚树薄雾
• 阅读 512

前几天面试被问懵了,还是关于 HashMap 的面试题,什么是负载因子?为什么是0.75?第一个问题还好回答,然而第二个问题就有点含糊其辞说不清楚了,所以今天就来好好复盘一下这道题。

HashMap 负载因子 load factor,也叫做扩容因子和装载因子,它是 HashMap 在进行扩容时的一个阈值,当 HashMap 中的元素个数超过了容量乘以负载因子时,就会进行扩容。默认的负载因子是 0.75,也就是说当 HashMap 中的元素个数超过了容量的 75% 时,就会进行扩容。当然,我们也可以通过构造函数来指定负载因子,如下所示:
被问懵了:什么是负载因子?为什么是0.75?

扩容计算公式

HashMap 扩容的计算公式是:initialCapacity * loadFactor = HashMap 扩容。
其中,initialCapacity 是初始容量,默认值为 16(懒加载机制,只有当第一次 put 的时候才创建),loadFactor 是负载因子,默认值为 0.75。也就是说当 16 * 0.75 = 12 时,HashMap 就会开始扩容。

为什么要进行扩容?

HashMap 扩容的目的是为了减少哈希冲突,提高 HashMap 性能的。

为什么默认负载因子是 0.75?

HashMap 负载因子 loadFactor 的默认值是 0.75,为什么是 0.75 呢?官方给的答案是这样的:

As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs. Higher values decrease the space overhead but increase the lookup cost (reflected in most of the operations of the HashMap class, including get and put). The expected number of entries in the map and its load factor should be taken into account when setting its initial capacity, so as to minimize the number of rehash operations. If the initial capacity is greater than the maximum number of entries divided by the load factor, no rehash operations will ever occur.

上面的意思,简单来说是默认负载因子为 0.75,是因为它提供了空间和时间复杂度之间的良好平衡。

负载因子太低会导致大量的空桶浪费空间,负载因子太高会导致大量的碰撞,降低性能。0.75 的负载因子在这两个因素之间取得了良好的平衡。

负载因子 0.75 的科学推测

也就是说官方并未对负载因子为 0.75 做过的的解释,只是大概的说了一下,0.75 是空间和时间复杂度的平衡,但更多的细节是未做说明的,然而 Stack Overflow 一位大神 https://stackoverflow.com/questions/10901752/what-is-the-significance-of-load-factor-in-hashmap 从科学的角度推测了这个问题的答案。
简单来说是通过二项式哈希函数的冲突概率来解释 0.75 这个问题的。

假设一个哈希桶为空和非空的概率为 0.5,我们用 s 表示容量,n 表示已添加元素个数。
用 s 表示添加的键的大小和 n 个键的数目。根据二项式定理,桶为空的概率为:

P(0) = C(n, 0) (1/s)^0 (1 - 1/s)^(n - 0)

因此,如果桶中元素个数小于以下数值,则桶可能是空的:

log(2)/log(s/(s - 1))

当 s 趋于无穷大时,如果增加的键的数量是 P(0) = 0.5,那么 n/s 很快趋近于 log(2),而 log(2) ~ 0.693。

所以,合理值大概在 0.7 左右,这就是对负载因子为 0.75 的一个科学推测。

小结

负载因子 loadFactor 是 HashMap 在进行扩容时的一个阈值,扩容的计算公式是:initialCapacity * loadFactor = HashMap 扩容。它的默认值为 0.75,此值提供了空间和时间复杂度之间的良好平衡。

参考文章

https://hollischuang.gitee.io/tobetopjavaer/#/basics/java-bas...

本文已收录至《Java面试突击》,专注 Java 面试 100 年,查看更多:www.javacn.site
点赞
收藏
评论区
推荐文章
推荐程序员面试秘籍!2021年大厂Java岗面试必问
01JAVA基础1.1java知识点Hashmap源码级掌握,扩容,红黑树,最小树化容量,hash冲突解决,有些面试官会提出发自灵魂的审问,比如为什么是红黑树,别的树不可以吗;为什么8的时候树化,4不可以吗,等等concureentHashMap,段锁,如何分段,和hashmap在hash上的区别,性能,等等HashTable,同步锁,这块可
Stella981 Stella981
3年前
HashMap原理学习
概述HashMap对于做Java的小伙伴来说太熟悉了。估计你们每天都在使用它。它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作为它的key呢?带着这些疑问让我们来了解HashMap!HashMap介绍1、介绍HashMap是一个用”KEY”“VALUE”
Wesley13 Wesley13
3年前
Java中HashMap和HashTable区别
        前几天被一家公司电面的时候被问到HashMap和HashTable的区别,当时就懵逼了,hashTable是个啥?从来没用过啊,于是电面完之后马上google了一把,这回涨姿势了;        HashMap和HashTable同属于Java.util包下的集合类,Hashtable是个过时的集合类,存在于JavaAPI中很久了。在J
Stella981 Stella981
3年前
HashMap和HashTable到底哪不同?
HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。代码版本JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK1.7.0\_67。源码见这里(https://www.oschina.net/action/GoTo
Stella981 Stella981
3年前
0730 直播|利用 Milvus 搭建生物多因子认证系统
!(https://oscimg.oschina.net/oscnet/0c15bd84290ecc2bd4e545256db2393ae94.png)信息安全越来越重要,而身份验证是其中最重要的一项。随着人工智能的逐渐成熟,生物多因子的认证技术也被更加广泛的应用到不同场景。所谓生物多因子认证,就是利用认证人所拥有的生物信息(包括指纹
Wesley13 Wesley13
3年前
N数码问题的启发式搜索算法
一、启发式搜索:A算法1)评价函数的一般形式:f(n)g(n)h(n)g(n):从S0到Sn的实际代价(搜索的横向因子)h(n):从N到目标节点的估计代价,称为启发函数(搜索的纵向因子);特点:效率高,无回溯, 搜索算法OPEN表:存放待扩展的节点.CLOSED表:存放已被扩展过的节点
Stella981 Stella981
3年前
KMO检验和Bartlett球形检验
KMO检验和Bartlett球形检验因子分析前,首先进行KMO检验和巴特利球体检验,KMO检验系数0.5,(巴特利特球体检验的x2统计值的显著性概率)P值<0.05时,问卷才有结构效度,才能进行因子分析,因子分析主要是你自己做了一份调查问卷,你要考量这份问卷调查来的数据信度和效度如何,能不能对你想要调查的东西起代表性作用啊,说得很通俗呵呵不知道能不能
Stella981 Stella981
3年前
JVM&NIO&HashMap简单问
_JVM&NIO&HashMap简单问_背景:前几天在网上看到关于JVM&NIO&HashMap的一些连环炮的面试题,整理下以备不时之需。_一、JVM_Java的虚拟机的面试内容主要包括GC、类加载机制和内存三大部分。如下是一个一个GC部分简单的连环炮:问:什么时候一个对象会被GC?答:当没有任何对象的引用指向该对
可莉 可莉
3年前
0730 直播|利用 Milvus 搭建生物多因子认证系统
!(https://oscimg.oschina.net/oscnet/0c15bd84290ecc2bd4e545256db2393ae94.png)信息安全越来越重要,而身份验证是其中最重要的一项。随着人工智能的逐渐成熟,生物多因子的认证技术也被更加广泛的应用到不同场景。所谓生物多因子认证,就是利用认证人所拥有的生物信息(包括指纹
九路 九路
2年前
Java HashMap源码分析
我们知道,HashMap是最常用的key,value结构之一,也是面试官最爱问的面试题之一今天我们就来从源码角度来解析一下,HashMap底层的原理
Java HashMap 的工作原理详解
JavaHashMap的工作原理详解HashMap的工作原理是近年来常见的java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题
虚树薄雾
虚树薄雾
Lv1
江南可采莲,莲叶何田田!
文章
1
粉丝
0
获赞
0
热门文章

暂无数据