HashMap、ConcurrentHashMap的容量为什么总是2的n次幂

前言

随着这个java行业的内卷越来越严重,鉴别一个技术人实力的标准也越来越高,区别于他人的唯一标准就是深入到java中的每个细节,让别人“无路可走”。

一、问题由来

这个问题的由来有两个方面:一个是咱们前边分享HashMap源码的时候,看到DEFAULT_INITIAL_CAPACITY值上边的注释:The default initial capacity - MUST be a power of two。另外一个是听朋友说他面试的时候被问到了这个问题。这个就是今天这篇文章的前世。

二、为什么?

其实原因也特别简单,不知道兄弟们还记得之前分享文章中的map的路由算法不?如果忘记了可以看这篇文章:金三银四之HashMap剖根问底栏目

hashmap的路由算法是一个与运算:n-1 & hash

看见这个等式如果对与运算运用的比较深刻,肯定一下子就明白其中的原因了。
首先,我们先说一下这个计算包含的意义:

  • 该式子的值永远不会大于n-1
  • 该式子是用来路由的,决定新插入的值放进那个链表里

其次,我们用数据假设的推理方法来进行推理证明(我就文字代替数学的符号了):

假设n = 2x-1
那么n-1 = 2x-1
所以(n - 1) & hash的值只出出现两个:0或者n-1。


假设n = 2x
那么n-1 = 2x-1
所以(n - 1) & hash的值会根据hash值得不同分散在链表的不同索引上,保证了数据的均衡

相信看到这里大家已经察觉到问题所在了:这会出现严重的碰撞,数据失衡,java8的红黑树也失去了意义,因此HashMap、ConcurrentHashMap的容量必须是2n

三、题外话

java是真简单,也是真难,入手很快,但是想成为高手也是真的难,愿我们都能保持热情,乘风破浪,在有限的时间做出最大的成绩,加油。

四、结语

道阻且长,行则将至,行而不辍,未来可期,加油。

原创不易,如果你觉得文章不错,对你的进步有那么一点帮助,那么就给个小心心,如果觉得文章非常对你的胃口,那么欢迎你关注我,或者关注个人的微信公众号 程序猿每日分享,这里有资源,有内推,有和你志同道合的朋友,咱们一起打怪升级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿每日分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值