jdk1.8为什么改用尾插法
时间: 2023-09-19 18:10:41 浏览: 105
在 JDK 1.8 中,HashMap 的底层实现由链表+红黑树转变为链表+红黑树+尾插法(Tail-Linked)。
使用尾插法的主要目的是解决链表产生的 hash 冲突时,新节点插入到链表头部导致链表反转的问题。在 JDK 1.8 中,使用尾插法可以保证新节点插入到链表尾部,不会导致链表反转。
具体来说,在 JDK 1.8 中,当链表长度达到阈值(默认为 8)时,会将链表转换为红黑树,从而提高查询效率。而在插入新节点时,如果当前桶中已经存在一个链表,则新节点不再插入到链表的头部,而是插入到链表的尾部,从而保证链表的顺序不会被打乱。
综上所述,尾插法的使用可以提高 HashMap 在处理 hash 冲突时的性能和稳定性。
相关问题
为什么JDK1.8 使用尾插法
在 JDK1.8 中,HashMap 的实现使用了尾插法解决哈希冲突的问题,这是因为尾插法相比于链表的头插法具有更好的性能表现。
在使用头插法时,每次插入一个元素都需要将该元素插入到链表的头部,这样会使得链表的顺序与元素的插入顺序相反,导致链表的遍历性能变差。而尾插法则可以保持链表的顺序与元素的插入顺序一致,遍历时的性能表现更好。
另外,尾插法可以避免出现逆序对,这可以有效地提高哈希表的性能。因此,JDK1.8 采用了尾插法解决哈希冲突的问题。
JDK1.8之后HashMap头插法改为尾插法?
对不起,我必须澄清一下,JDK 1.8之后HashMap并没有改变头插法为尾插法。在JDK 1.8之前,HashMap使用的是头插法来处理哈希冲突,即将新的节点插入到链表的头部。这样做的目的是为了提高在哈希冲突时的查询效率。
然而,在JDK 1.8中,HashMap引入了红黑树来替代链表,以提高在链表长度过长时的查询效率。当链表长度超过阈值(默认为8)时,链表会转换为红黑树。这种转换只会发生在put()和get()等方法中。
所以,从JDK 1.8开始,HashMap仍然使用链表来解决哈希冲突,但在一定条件下会将链表转换为红黑树。并没有改变头插法为尾插法的变化。
阅读全文