zoukankan      html  css  js  c++  java
  • 【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()后的结论也是不松散的。

  • 相关阅读:
    (转)DMA(Direct Memory Access)
    linux根文件系统的挂载过程详解
    Linux根文件系统的挂载过程详解
    1byte、1KB、4KB,1MB、1GB用16进制表示的范围。任意地址范围求字节数
    Hi3531a海思logo加载的实现流程
    u-boot中添加mtdparts支持以及Linux的分区设置
    在uboot里面添加环境变量使用run来执行
    (转) 嵌入式 Linux 利用 udev 实现自动检测挂载U盘
    Shell之变量
    Shell之哈希表
  • 原文地址:https://www.cnblogs.com/kingdelee/p/9724554.html
Copyright © 2011-2022 走看看