HashMap负载因子为什么是0.75

摘要:
为什么HashMap负载因子写为0.75?当HashMap的数组长度达到临界值时,将触发扩展。临界值由负载因子和当前容量决定:因此,在使用哈希容器时,请尝试估计自己的数据量以设置初始值。*nodesinbins的频率如下:泊松分布*(http:
待写

HashMap负载因子为什么是0.75?
HashMap有一个初始容量大小,默认是16
static final int DEAFULT_INITIAL_CAPACITY = 1 << 4; // aka 16    
为了减少冲突概率,当HashMap的数组长度达到一个临界值就会触发扩容,把所有元素rehash再放回容器中,这是一个非常耗时的操作。
而这个临界值由负载因子和当前的容量大小来决定:
DEFAULT_INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR
即默认情况下数组长度是16*0.75=12时,触发扩容操作。
所以使用hash容器时尽量预估自己的数据量来设置初始值。
那么,为什么负载因子要默认为0.75,在HashMap注释中有这么一段:
Ideally, under random hashCodes, the frequency of
* nodes in bins follows a Poisson distribution
* (http://en.wikipedia.org/wiki/Poisson_distribution) with a
* parameter of about 0.5 on average for the default resizing
* threshold of 0.75, although with a large variance because of
* resizing granularity. Ignoring variance, the expected
* occurrences of list size k are (exp(-0.5) * pow(0.5, k) /
* factorial(k)). The first values are:
*
* 0:    0.60653066
* 1:    0.30326533
* 2:    0.07581633
* 3:    0.01263606
* 4:    0.00157952
* 5:    0.00015795
* 6:    0.00001316
* 7:    0.00000094
* 8:    0.00000006
* more: less than 1 in ten million
*
在理想情况下,使用随机哈希吗,节点出现的频率在hash桶中遵循泊松分布,同时给出了桶中元素的个数和概率的对照表。
从上表可以看出当桶中元素到达8个的时候,概率已经变得非常小,也就是说用0.75作为负载因子,每个碰撞位置的链表长度超过8个是几乎不可能的。
hash容器指定初始容量尽量为2的幂次方。
HashMap负载因子为0.75是空间和时间成本的一种折中。

泊松分布:https://blog.csdn.net/ccnt_2012/article/details/81114920

免责声明:文章转载自《HashMap负载因子为什么是0.75》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python深入:Distutils安装包Yii2通过curl调用json-rpc接口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java-生成指定长度验证码的一种简单思路

 前言:以前做过的一个项目,刚开的时候始验证码是在前端生成前端验证的,后来觉得不靠谱,另外就是找回密码的功能也需要发送邮件和短信的验证码,所以,验证码就必须在后端生成并且保存到应用会话中才行了!所以,就有了下面的这段简单的代码,这段代码虽然简单,但也是生成验证码的一种思路,在此小记一笔以备后用。 1:如下是生成验证码、测试生成验证码的方法,比较简单,注释也...

机器学习技法 --- 融合模型

1、主要内容   在已经使用某个模型的情况下,如何将这些模型进行融合使得模型更好的预测,这种技术就是融合模型技术。 2、融合模型的引入   你要买股票,有T个朋友做参考你听谁的?买还是不买?      你可以采取的措施: 选择最有价值的朋友的推荐---对应到机器学习就是一个模型的选择,就是验证(validation)选择性能最好的那个模型 或者认为他们的...

java中数组、list、泛型集合的长度

1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性. 2 java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法. 3.java中的size()方法是针对泛型集合说的,如果想看这个集合有多少个元素,就调用此方法来查看...

iPhone4激活出错,菜鸟试验!!!!!

测试机:8G,无sim卡,iOS6.1.3 升级(iOS7.0.4)条件:容量至少3.7G 我的操作:删除所有的App,容量3G剩余,依然不够,“通用”——>“还原”——>“抹掉所有内容和设置”,等待几分钟,就出现如下列图: 选择语言,点击右上角按钮: 选择地区,点击“下一步”: 选择wifi,点击“下一步”: 等一会出现如下图: 对...

获取验证码的URL后边为什么要加上一个值不断变化的参数?

$(function(){ $("#change").click(function(){ //修改src属性 $("#imgCode").attr("src","image.action?dt="+new Date().getTime()); return false;//阻止href动作 }); }); 如上边代码所示,这是因为相同的url请求,浏览器不...

spark-调节executor堆外内存

什么时候需要调节Executor的堆外内存大小? 当出现一下异常时: shuffle file cannot find,executor lost、task lost,out of memory 出现这种问题的现象大致有这么两种情况: Executor挂掉了,对应的Executor上面的block manager也挂掉了,找不到对应的shuffle ma...