为啥HashMap的长度一定是2的n次方

5 篇文章 0 订阅

直接说原因:

  1. 计算方便
  2. hash分布更均匀

计算方便

当HashMap长度为2的次方时,等式 hash(key) & (length - 1) == hash(key) % length 成立
解释
hash(key) % length 得到的结果 hash(key) - (hash(key) / length) * length
因为HashMap长度为2的次方,所以length - 1 的值转成二进制为全1的形式(2的次方一定是 1000…… 这种形式,再减去1,剩下的一定都是1,没有0),hash(key) & (length - 1) 结果是和hash(key) % length 等价的

hash分布更均匀

先解释一下hash均匀的含义:hashmap调用put方法,根据key通过hash函数计算的到table数组的下标,理想情况是table数组可以充分被利用,即hash均匀
计算table数组下标的方式为: hash(key) & (length - 1)
& 运算有个特点,如果一个数的某一位为0,那么结果的对应位也为0
num1: 1111
num2: 1101
result: 1101
所以只有当length - 1为全 1时,才不会出现上述情况。

参考博客:https://juejin.cn/post/6844903813896224775
https://blog.csdn.net/zjcjava/article/details/78495416

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值