面试知识点学习7——hashMap相关问题

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

你可能感兴趣的:(数据结构java)