7.1 计算hash值为什么移位运算?为什么是右移16位?
7.2 Hash值计算为什么应用&运算?
7.3 容量为什么要是2的幂次方?
以上三个问题都对应于以下链接中的问答5、6、7
深刻了解 hashcode 和 hash 算法 - 一步之 - 博客园 (cnblogs.com)
7.4 为什么链表长度为8才转为红黑树?
首先遍历链表的均匀查找时间复杂度是 O(n),红黑树查找的工夫复杂度管制在 O(log(n)),在n较小的状况O(n) 和 O(log(n)) 差异不大,所以不间接采纳红黑树的形式。
其次,这在ConcurrentHashMap源码中有阐明,大略意思是如果hash值设置的好散布很平均的话,链表个别不会太长(因为达到容量的0.75就扩容了),如果设置转红黑树的链表长度越大转红黑树的概率就越小,通过大量测试当长度为 8 的时候,链表转红黑树的概率仅为 0.00000006,所以采纳了8。
同时也阐明一般来说是很少状况会呈现红黑树结构的,如果呈现了个别状况下咱们就要思考是不是咱们设计的对象的hash办法有问题!