美文网首页
HashMap的Hash算法

HashMap的Hash算法

作者: 响响月月 | 来源:发表于2018-10-19 18:12 被阅读0次

HashMap定位

  1. 取key的HashCode值
  2. 高位运算
  3. 计算索引

求HashCode值

  1. Integer: value
public static int hashCode(int value) {
      return value;
}
  1. Long: 于高位做异或
public static int hashCode(long value) {
      return (int)(value ^ (value >>> 32));
}
  1. Double: 变成long型,按long取HashCode
public static int hashCode(double value) {
     long bits = doubleToLongBits(value);
     return (int)(bits ^ (bits >>> 32));
}
  1. String: h = 31 * h + val[i];
public int hashCode() {
      int h = hash;
      if (h == 0 && value.length > 0) {
          char val[] = value;
          for (int i = 0; i < value.length; i++) {
              h = 31 * h + val[i];
          }
          hash = h;
      }
      return h;
}
  • 为什么是 31 呢?
    因为 31 是一个素数。(素数又称质数:指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。)
    根据素数的特性,与素数相乘得到的结果比其他方式更容易产生唯一性,也就是说产生 hash 值重复的概率比较小。
    Java 中如果相乘的数字太大会导致内存溢出问题,从而导致数据丢失。

高位运算

高16位异或低16位

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

计算索引

  • 定位table:
    取模计算慢
    hash&(table.length-1) (eg: 1111取‘&与’)
    table.length为2的幂次方时,相当于对length取模
  • 有值转为链表
  • 超过8个转为红黑树

扩容

超过capacity * 0.75扩容
扩为2 * capacity

相关文章

  • HashMap常见问题(更新中)

    HashMap //JDK1.8以后的HashMap部分源码 hash算法的优化: 对每个hash值,将他的高低十...

  • HashMap原理解析

    HashMap解析 HashMap的寻址算法优化 JDK1.8之后的hash运算 寻址算法 n 指的是数组的长度 ...

  • 深入解析HashMap那些不为人知的事

    HashMap 光从名字上应该也能猜到,HashMap肯定是基于hash算法实现的,这种基于hash实现的map叫...

  • Java 容器 --- HashMap分析

    HashMap部分源码 hash算法 可以看到hash算法计算分为三步 1.获得key的hash值2.在1的基础上...

  • HashMap的Hash算法

    HashMap定位 取key的HashCode值高位运算计算索引 求HashCode值 Integer: valu...

  • 目录【Java实习生准备】

    HashMap底层详解-001-数据结构、put、get HashMap底层详解-002-hash算法、长度的秘密

  • HashMap 分析 实现

    HashMap 这个集合经常用到的 首先什么是hash 写一个hash算法 第一步简单的hash 分析hash 就...

  • 基础问题

    HashMap的hash算法和寻址算法的优化 原hash值与右移后的hash值进行异或运算(一样就是0,不一样就是...

  • 【集合】Hashmap

    0.参考文献: hash算法 (hashmap 实现原理)Java实现的散列表 1.HashMap的数据结构 数组...

  • Hashmap中hash算法

    首先将高16位无符号右移16位与低十六位做异或运算。如果不这样做,而是直接做&运算那么高十六位所代表的部分特征就可...

网友评论

      本文标题:HashMap的Hash算法

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