这个问题分两步分析:
1、为什么是链表长度大于8时
看一下源码解释
就是官方做过很多测试,发现链表长度在大于8以后再出现hash碰撞的可能性几乎为0,虽然转化为红黑树后,查找的效率会比链表高,但是转化红黑树这个过程是耗时的,而且在扩容时还要对红黑树重新的左旋右旋保持平衡,相对耗时,所以,阈值设置为8就是为了尽量减少hashmap中出现红黑树(hashmap中链表才是常态)
2、为什么数组长度大于64时
同样,先看一下源码怎么解释的
其实这个源码中解释的不清不楚,里边说最小应该为4*8的倍数(TREEIFY_THRESHOLD=8)以减少碰撞,那这个也可以是32呀。
可能没有什么实际根据,不像上边的阈值8一样,是经过实际测试过的。这里只是猜测,也有可能是根据操作系统有关:64位的操作系统的最大内存寻址空间为2的64次方,数组长度小于64时,64位的操作系统也完全能够应对,这时候进行扩容要比转化红黑树效率高的多;相反,如果数组过长,进行一次扩容要迁移的数据更多,会比转化红黑树效率低。(这里只是猜测,后续如有新的证明会及时更新)