JDK1.8之後,HashMap轉變紅黑樹
阿新 • • 發佈:2020-12-16
當連結串列長度大於8並且陣列長度大於64時,才會轉換為紅黑樹
根據原始碼註釋:
1.TreeNodes佔用空間是普通Nodes的兩倍。
只有當bin(bin就是bucket-桶,即HashMap中hashCode值一樣的元素儲存的地方)包含足夠多的節點時才會轉成TreeNodes,而是否足夠多就是由TREEIFY_THRESHOLD的值決定的。當bin中節點數變少時,又會轉成普通的bin。
2.根據泊松分佈計算概率
當hashCode離散性很好的時候,樹型bin用到的概率非常小,因為資料均勻分佈在每個bin中,幾乎不會有bin中連結串列長度會達到閾值。但是在隨機hashCode下,離散性可能會變差,然而JDK又不能阻止使用者實現這種不好的hash演算法,因此就可能導致不均勻的資料分佈。不過理想情況下隨機hashCode演算法下所有bin中節點的分佈頻率會遵循泊松分佈。
* 0: 0.60653066
* 1: 0.30326533
* 2: 0.07581633
* 3: 0.01263606
* 4: 0.00157952
* 5: 0.00015795
* 6: 0.00001316
* 7: 0.00000094
* 8: 0.00000006
* more: less than 1 in ten million
可以看到,連結串列長度達到8個元素的概率為0.00000006,幾乎是不可能事件