爲什麼HashMap桶中個數超過8才轉爲紅黑樹

TreeNodes佔用空間大約是普通Nodes的兩倍

鏈表長度達到8就轉成紅黑樹,當長度降到6就轉成普通bin.
說白了就是trade-off,空間和時間的權衡

  • 當hashCode離散性很好的時候,樹型bin用到的概率非常小,因爲數據均勻分佈在每個bin中,幾乎不會有bin中鏈表長度會達到閾值。
  • 但是在隨機hashCode下,離散性可能會變差,然而JDK又不能阻止用戶實現這種不好的hash算法,因此就可能導致不均勻的數據分佈。
  • 不過理想情況下隨機hashCode算法下所有bin中節點的分佈頻率會遵循泊松分佈,我們可以看到,一個bin中鏈表長度達到8個元素的概率爲0.00000006,幾乎是不可能事件。
  • 所以,之所以選擇8,不是拍拍屁股決定的,而是根據概率統計決定的。
普通Node
static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;


static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
        TreeNode<K,V> parent;  // red-black tree links
        TreeNode<K,V> left;
        TreeNode<K,V> right;
        TreeNode<K,V> prev;    // needed to unlink next upon deletion
        boolean red;

static class Entry<K,V> extends HashMap.Node<K,V> {
        Entry<K,V> before, after;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章