HashMap解读

2021-05-15  本文已影响0人  LHZ_123
static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

因为HashMap是通过上面的位运算计算数组下标的,可以看到hash值的高位都被归零,只有低位参与了运算,为了让计算出来的下标更均匀,尽量的减少碰撞,所以通过扰动函数将高位的值也反应到低位的运算上。原理如下:
例如 h = key.hashCode() 对应的二进制编码为 00000000 00110110 01000100 10010010
h >>> 16 对应的二进制编码为 00000000 00000000 00000000 00110110
h ^ (h >>> 16) 对应的二进制编码为 00000000 00110110 01000100 10110110
通过移位再或运算,就将默认的hashCode的高位和低位都反映到了低位上,扰动之后得到的hash再进行下标计算,得到的值相等来说就更随机,从而尽量减少碰撞。

上一篇 下一篇

猜你喜欢

热点阅读