HashMap的初始长度是16,每次扩容时都会在原始的长度上翻倍(size × 2),所以长度一定是2的n次方。
红黑树的出现时机(链表树化):1. 链表的长度达到8; 2. 元素的总数量达到64。
红黑树退哈成链表: 红黑树中元素的数量小于6。
哈希桶扩容的条件:元素数量 >= 长度(16)× 加载因子(0.75)
扩容时,需重新计算桶中每一个位置的内容:
如果原桶内容为空,则直接复制过去;
当桶位置连有链表时,则计算出该链表的低位链和高位链,如果是低位链则直接复制到原索引位置,如果是高位链,则复制到(原索引 + 原长度)的位置(新索引),桶位置是红黑树时,同理,因为树种有退化成链表时需要的节点地址值,所以红黑树同样可计算出该树的低位链和高位链。
链表转换成红黑树的阈值为什么是 8 ,而加载因子为什么是0.75?
在hashCode离散性很好的情况下,红黑树用到的概率非常小,因为数据均匀分布在每个桶中,几乎不会有桶中链表长度会达到阈值(8)。但是在随机hashCode下,离散性可能会变差,然而JDK又不能阻止用户实现这种不好的hash算法,因此就可能导致不均匀的数据分布。
事实上,随机hashCode算法下所有桶中节点的分布频率遵循如下的泊松分布。在扩容阈值为0.75的情况下,(即使因为扩容而方差很大)遵循着参数平均为0.5的泊松分布。一个桶中链表长度达到8个元素的概率为0.00000006,几乎是不可能事件。之所以选择8