为什么选择了0.75作为HashMap的加载因子呢?这个跟一个统计学里很重要的原理——泊松分布有关。
描述单位时间内随机事件发生的次数的概率分布。
P 表示概率,N表示某种函数关系,t 表示时间,n 表示数量,λ 表示事件的频率。
随机哈希码,在扩容阈值(加载因子)为0.75的情况下,节点出现在频率在Hash桶(表)中遵循参数平均为0.5的泊松分布。
忽略方差 则 lambda * t = 0.5 此时
* 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.8或者0.6?
选择0.75作为默认的加载因子,完全是时间和空间成本上寻求的一种折衷选择。
当负载因子为0.75时,空间利用率比较高,避免了相当多的Hash冲突。