Hashmap链表长度为8时转换成红黑树,你知道为什么是8吗
為什么要轉換?
每次遍歷一個鏈表,平均查找的時間復雜度是 O(n),n 是鏈表的長度。紅黑樹有和鏈表不一樣的查找性能,由于紅黑樹有自平衡的特點,可以防止不平衡情況的發生,所以可以始終將查找的時間復雜度控制在 O(log(n))。
最初鏈表還不是很長,所以可能 O(n) 和 O(log(n)) 的區別不大,但是如果鏈表越來越長,那么這種區別便會有所體現。所以為了提升查找性能,需要把鏈表轉化為紅黑樹的形式。
為什么不直接用紅黑樹?
通常如果 hash 算法正常的話,那么鏈表的長度也不會很長,那么紅黑樹也不會帶來明顯的查詢時間上的優勢,反而會增加空間負擔。所以通常情況下,并沒有必要轉為紅黑樹。
為什么閾值是8?
如果 hashCode 分布良好,也就是 hash 計算的結果離散好的話,那么紅黑樹這種形式是很少會被用到的,因為各個值都均勻分布,很少出現鏈表很長的情況。在理想情況下,鏈表長度符合泊松分布,各個長度的命中概率依次遞減,當長度為 8 的時候,概率僅為 0.00000006。這是一個小于千萬分之一的概率,通常我們的 Map 里面是不會存儲這么多的數據的,所以通常情況下,并不會發生從鏈表向紅黑樹的轉換。這體現了時間和空間平衡的思想.
目前能觸發轉化的兩個條件是:一個是鏈表的長度達到8個,一個是數組的長度達到64個,要同時滿足
HashMap到8時轉為紅黑樹到6轉為鏈表
為什么轉化為紅黑樹的閾值8和轉化為鏈表的閾值6不一樣,是為了避免頻繁來回轉化,影響性能
TreeNodes(紅黑樹)占用空間是普通Nodes(鏈表)的兩倍
總結
以上是生活随笔為你收集整理的Hashmap链表长度为8时转换成红黑树,你知道为什么是8吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HashMap的负载因子为什么默认是0.
- 下一篇: HashMap的扩容机制---resiz