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;