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方法有问题了!
