HashMap在JDK1.8前后区别精简说

Posted JavaQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap在JDK1.8前后区别精简说相关的知识,希望对你有一定的参考价值。

在JDK1.8以前版本中,HashMap的实现是数组+链表,它的缺点是即使哈希函数选择的再好,也很难达到元素百分百均匀分布,而且当HashMap中有大量元素都存到同一个桶中时,这个桶会有一个很长的链表,此时遍历的时间复杂度就是O(n),当然这是最糟糕的情况。

在JDK1.8及以后的版本中引入了红黑树结构,HashMap的实现就变成了数组+链表或数组+红黑树。添加元素时,若桶中链表个数超过8,链表会转换成红黑树;删除元素、扩容时,若桶中结构为红黑树并且树中元素个数较少时会进行修剪或直接还原成链表结构,以提高后续操作性能;遍历、查找时,由于使用红黑树结构,红黑树遍历的时间复杂度为 O(logn),所以性能得到提升。

HashMap在JDK1.8及以后的版本中引入了红黑树结构,若桶中链表元素个数大于等于8时,链表转换成树结构;若桶中链表元素个数小于等于6时,树结构还原成链表。因为红黑树的平均查找长度是log(n),长度为8的时候,平均查找长度为3,如果继续使用链表,平均查找长度为8/2=4,这才有转换为树的必要。链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。

选择6和8,中间有个差值7可以有效防止链表和树频繁转换。假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低。

为了更方便的技术交流,建了一个微信群,加博主微信wind7rui,盛邀你进群!

END 

如果觉得有收获,记得关注、点赞、转发。

以上是关于HashMap在JDK1.8前后区别精简说的主要内容,如果未能解决你的问题,请参考以下文章

HashMap实现原理JDK1.8

HashMap源码分析

JDK1.8 重识HashMap

JDK1.8中HashMap如何应对hash冲突?

JDK1.8中HashMap如何应对hash冲突?

JDK1.8 HashMap中put源码分析