遇见YY

导航

 

在HashMap中增加、删除、查找键值对时,定位key值在table中的索引位置都是一个关键的步䠫。

第一步计算key值的Hash值:

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); //高16位与低16位异或降低了碰撞率!
    }

第二步关键代码:

int length = table.length;
int index  = (length - 1) & hash; //因为length是2的2次幂,因此该代码等价于int index = hash%length;

哈希桶长度是2的正整数幂的2个好处:

1:通过key的hash值计算下标时使用位运算替代取模可以进行优化。

2:扩容(resize())的时候可以快速的定位下标。

(e.hash & oldCap) == 0
/**判断e的Hash值扩容后的高一位是否是0,从而确定该元素在新桶中的位置!**/

 

posted on 2021-02-04 15:24  一骑红尘妃子笑!  阅读(549)  评论(0编辑  收藏  举报