美文网首页
HashMap 中的 hash 原理

HashMap 中的 hash 原理

作者: xiangR | 来源:发表于2018-07-24 15:36 被阅读0次

HashMap 内部是一个散列表(数组?),存放时取 key 的 hashCode 作为 index 位,如果出现了 hash 冲突,则此 index 位以链表(length = 8 时转化为 红黑树)形式存放。

  • hashCode 为 int 型,默认为 -2147483648 到 2147483648,内存无法接受这么长的散列表,故使用 node 的 length - 1 做 & 运算。可以理解为低位掩码,也可以理解为截断高位吧。

      10100101 11000100 00100101
    & 00000000 00000000 00001111
    ----------------------------
      00000000 00000000 00000101
    
    
    以下位代码中的数组inedx 方法
    HashMap 中的取值皆是   ->  node = table[h & (length-1)] 
    
    static int indexFor(int h, int length) {
        return h & ( length - 1 );            
    }
    
  • 而仅仅使用 hashCode,会有比较高的冲突概率,所以 JDK 引入了 扰动函数,简单来说就是 int 值的32位,保留自己的高位16位,并使用高位与低位做 按位异或 ^ 来做低位16位,使用这种形式来降低 hash 冲突。


    image.png

相关文章

网友评论

      本文标题:HashMap 中的 hash 原理

      本文链接:https://www.haomeiwen.com/subject/tdtymftx.html