美文网首页
JDK1.8 对 HashMap 的优化

JDK1.8 对 HashMap 的优化

作者: pluss | 来源:发表于2018-06-01 17:54 被阅读0次

详细的解释 ↓
Java 8系列之重新认识HashMap
Java源码分析:关于 HashMap 1.8 的重大更新


  • 由 数组+链表 的结构改为 数组+链表+红黑树
    拉链过长会严重影响hashmap的性能,所以1.8的hashmap引入了红黑树。
    在链表元素数量超过8时改为红黑树,少于6时改为链表,中间7不改是避免频繁转换降低性能。
    相对于链表,改为红黑树后碰撞元素越多查询效率越高。链表O(n),红黑树O(logn)。
  • 优化了高位运算的hash算法:h^(h>>>16)
    将hashcode无符号右移16位,让高16位和低16位进行异或。
  • 扩容后,元素要么是在原位置,要么是在原位置再移动2次幂的位置,且链表顺序不变。
    不需要重新计算hash,只需要根据原来hash值新增的bit是1还是0分别放进两个链表lo和hi(非红黑树的情况)里,0的话索引没变,1的话索引变为原索引加原来的数组长度。
    因为用的尾插法所以新数组链表不会倒置,多线程下不会出现死循环。
42                 else if (e instanceof TreeNode)
43                     ((TreeNode<K,V>)e).split(this, newTab, j, oldCap);
44                 else { // 链表优化重hash的代码块
45                     Node<K,V> loHead = null, loTail = null;
46                     Node<K,V> hiHead = null, hiTail = null;
47                     Node<K,V> next;
48                     do {
49                         next = e.next;
50                         // 原索引
51                         if ((e.hash & oldCap) == 0) {
52                             if (loTail == null)
53                                 loHead = e;
54                             else
55                                 loTail.next = e;
56                             loTail = e;
57                         }
58                         // 原索引+oldCap
59                         else {
60                             if (hiTail == null)
61                                 hiHead = e;
62                             else
63                                 hiTail.next = e;
64                             hiTail = e;
65                         }
66                     } while ((e = next) != null);
67                     // 原索引放到bucket里
68                     if (loTail != null) {
69                         loTail.next = null;
70                         newTab[j] = loHead;
71                     }
72                     // 原索引+oldCap放到bucket里
73                     if (hiTail != null) {
74                         hiTail.next = null;
75                         newTab[j + oldCap] = hiHead;
76                     }
77                 }
  • put 方法链表头插改为尾插

相关文章

  • HashMap源码解析

    HashMap在JDK1.8之前底层的实现方式是数组+链表,从JDK1.8开始对HashMap底层进行了优化,改为...

  • 数据结构解析-HashMap

    概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,...

  • 数据结构解析-HashMap

    概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,...

  • HashMap

    1.概要 HashMap在JDK1.8之前的实现方式数组+链表,但是在JDK1.8后对HashMap进行了底层优化...

  • HashMap常见问题(更新中)

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

  • HashMap源码解析

    摘要 HashMap是程序猿使用频率最高的用于映射(键值对)的数据类型。JDK1.8对HashMap进行了优化,例...

  • 都说 HashMap 是线程不安全的,到底体现在哪儿?

    1.jdk1.7中的HashMap 在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题...

  • HashMap

    JDK1.8 hashmap底层是散列表+红黑树。java表现为数组+链表+红黑树。JDK1.8的优化是对扩容变为...

  • 学习计划

    第一周: ①学习了hashmap更具体的知识: JDK1.8中hashmap对链表很长时的优化,当链表长度太长时,...

  • HashMap原理解析

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

网友评论

      本文标题:JDK1.8 对 HashMap 的优化

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