【JVM】-NO.111.JVM.1 -【JDK11 HashMap详解-1-hash()剖析】

Style:Mac

Series:Java

Since:2018-09-10

End:2018-09-10

Total Hours:1

Degree Of Diffculty:5

Degree Of Mastery:5

Practical Level:5

Desired Goal:5

Archieve Goal:3

Gerneral Evaluation:3

Writer:kingdelee

Related Links:

http://www.cnblogs.com/kingdelee/

http://www.runoob.com/java/java-operators.html

1. hash()

   private int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

疑问:

1.1 为什么 h右移16位?

1.2 为什么 h^右移16位的自己?

直觉:

1.这一定是个牛逼轰轰的算法,能够让所有对象的hash后的值尽可能的松散不重复

原理引用:

1.int可以表示成32位的二进制数

2.>>> 即向右移动若干位,无符号

3.^    异或,a!=b,则为1

4. &   与, a=b=1,则为1

5. |     或,(a|b)=1,则为1

6. ^    非, 取反

推导:

1. 为何是16位不是18位或者17位?右移16位和32位有毛关系?

举例:

疑问:为什么要用 ^ 而不是 | & !?

通过上述可以看出来

只有^的结果是不唯一的,而& |的结果都是有重复的

所以^的特性能够实现该算法结果不会重复

结论:

该算法可以实现随着hashcode的递增,hash()的值不重复的递增
很好的生成hash分布均匀的值

经验:

1.除了明白位运算的简单结果,还要明白其具备的特性在算法中的实际应用。

如 a^0的时候仍为a,可以利用这个在hash中进行散列使用

2.移位运算,除了寻常的对2的次幂如,a<<n是 a乘以2的n次, a>>n是 a除以2的n次,之外还有通过本质的二进制看待,可以实现折半的效果

3.尽可能的让hashcode不重复,最终得出来hash()值才不重复,否则一堆自己重写hashcode()指定值为1,hash()后的结论也是不松散的。

原文地址:https://www.cnblogs.com/kingdelee/p/9724554.html