HashMap的Hash算法

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Deve...
    周二倩你一生阅读 1,399评论 0 5
  • HashMap 是 Java 面试必考的知识点,面试官从这个小知识点就可以了解我们对 Java 基础的掌握程度。网...
    野狗子嗷嗷嗷阅读 6,848评论 9 107
  • 特朗普从宣布参选美国总统那一天起,他的人气就一路刷爆。一开始,人们觉得他参加竞选只是一个笑话,如今,这个像笑话一样...
    优质写作侠阅读 734评论 0 4
  • 或许,这个题目的短篇小说很多。但是我说的是在爱情面前的选择。 因为,爱情面前人人平等但是。你要明白,你喜欢的那个他...
    亦无情阅读 199评论 0 0
  • 1、前段时间朋友看到的故事【故事摘自网络,非原创】,颇有感触,就发与我来分享 她说:爸妈离婚,就因为爸爸向妈妈养的...
    天空吥会掉眼泪阅读 183评论 0 1

友情链接更多精彩内容