为什么HashMap链表转红黑树的阈值为8呢?

树化发生在table数组的长度大于64,且链表的长度大于8的时候。

为什么是8呢?源码的注释也给出了答案。

collection-21.png

红黑树节点的大小大约是普通节点大小的两倍,因此将节点转换为红黑树是一种以空间换取时间的策略,主要用于保证在极端情况下的查找效率。

为什么选择阈值为8呢?这与统计学有关。在理想情况下,使用随机哈希码,链表中的节点应该符合泊松分布,节点个数逐渐减少的概率是递减的。当节点个数为8时,发生的概率仅为0.00000006。

至于为什么红黑树转回链表的阈值是6而不是8,原因是如果将该阈值设置为8,当发生碰撞并且节点的增减正好在8附近时,会频繁地在链表和红黑树之间进行转换,导致资源浪费。因此,通过将阈值设置为6,可以更好地平衡性能和资源利用率。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题