HashMap中容量为什么用2的幂次方,不用素数

  1. 众所周知,很多结构如Hashtable初始容量都用是11,用的素数,为了后期存数据的时候能后分布更均匀
    如果用合数,重新rehash后,之前在一组的数又会重新在一起,所以不分散,所以不采用
  2. HashMap为什么要求容量是2的幂次方呢?
    对,就用是之前在一组的数字,rehash之后会重新在一起。

定义数字为n,容量为cap,cap为2的幂次方
则一般取模运算为: n&(cap-1)

举例:
cap=16, n1 = 26

  0000 0000 0001 1010
| 0000 0000 0000 1111
-------------------------------
  0000 0000 0000 1010

n2 = 10

  0000 0000 0000 1010
| 0000 0000 0000 1111
-------------------------------
  0000 0000 0000 1010

n1、n2放在同一个table[10]中

如果cap扩容倍,则cap=32
n1=26

  0000 0000 0001 1010
| 0000 0000 0001 1111
-------------------------------
  0000 0000 0001 1010

n2=10

  0000 0000 0000 1010
| 0000 0000 0001 1111
-------------------------------
  0000 0000 0000 1010

则n1放在table[26],n2放在table[10]中

综上所述

  • 在同一桶中的值table[i],在扩容一倍后会放到table[i+oldCap]中
  • 求新数字放到table[i]和table[i+oldCap]中的方法为:判断n中针对oldCap的1所在的最高位是0还是1
    • 如果n&oldCap为1,则放到table[i+oldCap]
    • 如果n&oldCap为0,则放到table[i]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值