HashMap 位运算原理整理

hash计算公式: h ^ (h >>> 16)

h 为 Java native 计算得出的hash值,int类型32位
假如 h 值如下:

h dec: 2026691355
h bin: 01111000110011001101101100011011

h 无符号右移(>>>)16位结果:

bin: 00000000000000000111100011001100
dec: 30924

hash异或(^)30924 结果:

01111000110011001101101100011011
00000000000000000111100011001100
--------------------------------
01111000110011001010001111010111

高16位没变,第16跟高16位异或,最终计算得:

bin: 01111000110011001010001111010111
dec: 2026677207

计算数组下角标公式:(n - 1) & hash

n 为数组长度,假如当前长度为 128

(128 - 1) & 2026677207

128 - 1 结果:

dec: 127
bin: 1111111

与运算:

00000000000000000000000001111111
01111000110011001010001111010111
--------------------------------
00000000000000000000000001010111

结果:

dec: 87
bin: 00000000000000000000000001010111

因为数组长度 n 为 2的幂次方,所以所有 n -1 的二进制值为:低位指数m个1高位补零
比如上方数组长度为128,为2的7次方。 128-1 为 127 用二进制值表示必定为低位7个1高位补零:00000000000000000000000001111111

而任何数与 00000000000000000000000001111111 进行与运算的计算结果必定在 00000000000000000000000001111111 范围内(因为高位都是0低位都是1与其与运算得出的结果高位仍然还是0),所以计算得出的数组下标必定不会超过数组长度(类似与取模运算)。

扩容两倍:newCap = oldCap << 1

左移一位就相当于 oldCap * 2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值