HashMap之hash原理计算

HashMapJDK1.8 hash算法:

static final int hash(Object key) {

    int h;

//key的hash值高16位不变,低16位与高16位异或作为key的最终hash值

//(h >>> 16,表示无符号右移16位,高位补0,任何数跟0异或都是其本身,因此key的hash值高16位不变。)

    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);    //key.hashCode()为哈希算法,返回初始哈希值

}

 Hash 就是散列的意思

首先将高16位无符号右移16位与低十六位做异或运算。如果不这样做,而是直接做&运算那么高十六位所代表的部分特征就可能被丢失 将高十六位无符号右移之后与低十六位做异或运算使得高十六位的特征与低十六位的特征进行了混合得到的新的数值中就高位与低位的信息都被保留了 ,而在这里采用异或运算而不采用& ,| 运算的原因是 异或运算能更好的保留各部分的特征,如果采用&运算计算出来的值会向1靠拢,采用|运算计算出来的值会向0靠拢   

接下来将得到的值与与0xf做&运算 目的是得到后四位的数值,得到后四位的下标在0~15之间 对应的放在哪个桶里面,当然这里存在扩容的问题,根据实际情况确定桶的个数 

学习资料:

https://blog.csdn.net/qq_28523617/article/details/77533097

http://www.cnblogs.com/PoorGuy/p/10397346.html

http://www.cnblogs.com/bruceChan0018/p/8033897.html

https://blog.csdn.net/crazy1235/article/details/75579654

https://www.cnblogs.com/finite/p/8251587.html

https://www.cnblogs.com/mfrank/p/9227097.html

 

posted @ 2020-05-25 10:54  我是张某某  阅读(716)  评论(0)    收藏  举报