为什么HashMap的桶数量是2的幂次方

前段时间去面试的时候坐在等候室里,听到隔壁会议室里的面试:

面试官:“你说一下为什么HashMap的长度为什么要设计成2的幂次方”

面试者:“因为计算机计算是二进制运算,所以balabala.....”

当时听的很模糊,也不知道面试者回答的是不是对的,所以一直记着回来一定要上网查一下正确的原因……

 

查阅了相关文章后,其实面试者回答的方向是对的,确实是为了提高运算效率。

 

我们都知道HashMap计算key的位置算法为:key.hash%length;

查看源码发现实现已优化为:hash & (length - 1),很显然,因为计算机位运算的效率比直接进行取余来的快;

可以思考一下什么当length的值为什么的时候 hash % length == hash & (length - 1)

答案就是当length为2的幂次方时。

可以验证一下:5 % 8 = 5,5 & (8 -1) = 110 & 111 = 110 = 5(十进制)

由此与运算可以思考一下为什么2的幂次方可以减少Hash碰撞;

因为(2的n次方-1)的二进制是n个1,一个key的hash值&1111……,就可以保证结果最大程度取决于key.hash。

如果是key.hash & 2n次方,就是 hash % 100……,与运算则后面的结果全都为0,增大了hash碰撞的概率。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值