JDK8的HashMap为啥要引入红黑树?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK8的HashMap为啥要引入红黑树?相关的知识,希望对你有一定的参考价值。
参考技术A 当HashMap的key冲突过多时,会导致链表过长。而链表的查询效率很差,因此引入红黑树优化查询效率。为什么当链表长度大于8时候才会转红黑树而不是一开始直接使用红黑树:
树节点占用空间是普通节点的两倍,因此在开始较短时候使用链表,占用空间少,查询性能也相差不大。但是当链表越来越长,查询效率逐渐变低,为保证查询效率才会舍弃链表转为红黑树,以空间换时间。
根据统计,HashMap链表长度为8的概率仅有不到千万分之一,这时链表的查询性能很差了。在这种极端罕见的情况下才会将链表转换为红黑树。
HashMap的工作原理以及代码实现,为什么要转换成红黑树?
原理参考:https://blog.csdn.net/striveb/article/details/84657326
总结:
为什么当桶中键值对数量大于8才转换成红黑树,数量小于6才转换成链表?
参考:https://blog.csdn.net/xingfei_work/article/details/79637878
HashMap在JDK1.8及以后的版本中引入了红黑树结构,若桶中链表元素个数大于等于8时,链表转换成树结构;若桶中链表元素个数小于等于6时,树结构还原成链表。因为红黑树的平均查找长度是log(n),长度为8的时候,平均查找长度为3,如果继续使用链表,平均查找长度为8/2=4,这才有转换为树的必要。链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。
还有选择6和8,中间有个差值7可以有效防止链表和树频繁转换。假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低。
以上是关于JDK8的HashMap为啥要引入红黑树?的主要内容,如果未能解决你的问题,请参考以下文章
别以为JDK8有了红黑树,HashMap就不会有死循环问题!