HashMap 中散列值的计算

HashMap java 1.8 中的源码:

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    i = (n - 1) & hash

h >>> 16 代表无符号右移,高位补零。

hashCode() 的高16位不变,低16位与高16位异或作为 key的最终 hash 值。

这么做是为了最后避免最后计算索引值只有低位参与。减少碰撞。

在这里插入图片描述

将得到的 hash 与通的大小 n - 1 相与得到 key 所在桶的位置。

这里 n 是2的整数幂,所以 (n - 1) & hash 相当于 n % hash 运算,这么做是为了加快运算速度,这也解释了为什么桶的大小要设置为2的整数幂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章