在Java 1.8中,HashMap的链表在什么条件下会转换为红黑树?
在Java 1.8中,HashMap的链表在满足以下条件时会转换为红黑树:
-
链表的长度达到8。在进行插入操作时,如果链表长度超过8,HashMap会触发扩容操作。在扩容过程中,HashMap会检查链表长度是否达到8。如果达到8,则会将链表转换为红黑树。
-
哈希表的大小达到64。在HashMap中,哈希表的大小(size)是指哈希表中桶(bucket)的数量。当哈希表的大小达到64时,HashMap会触发扩容操作。在扩容过程中,HashMap会检查哈希表的大小是否达到64。如果达到64,HashMap会尝试将链表转换为红黑树,以减少搜索时间。
疑问?
那为什么会是8 呢?
HashMap在jdk1.8之后引入了红黑树的概念,表示若桶中链表元素超过8时,会自动转化成红黑树;若桶中元素小于等于6时,树结构还原成链表形式。
原因:
红黑树的平均查找长度是log(n),长度为8,查找长度为log(8)=3,链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要;链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。
还有选择6和8的原因是:
中间有个差值7可以防止链表和树之间频繁的转换。假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低。