彻底搞懂HashMap(上)( 二 )


如果做到了以上两步 , 那么我就保证两件事情
第一点 32位的变化值 他尽可能的参与到运算
第二点 得到的结果是一个0,1 平均最高的数字
接下来我们来看式子二
式子2 很简单 , 就是n-1, 为啥要使用&和式子一计算, 那又是为啥 , 接下来我们就来解答这些问题
为什么要用&
问题一为啥要用&、
你有没有想过 , 万一我通过 一个所谓的哈希算法算出来的index它的值并不在数组索引里 , 比如 , 我有10个抽屉的位置 , 我通过哈希算法算出来的index 是101,那这个元素都跑到天边去了 , 还怎么放 , 没法放 , 所以我们在选用计算符号时 , 一定要确保 最终计算出来的结果一定 小于索引的 , 通过计算的式子1 , 有16 位之多 , 可以不用考虑 , 那么也就是说 , 最终得到的结果一定得小于或者等于 n-1, 而数组索引从0 开始计算 , 如果小于或者等于n-1 不就正好满足吗?那&的特性 同1 得1, 就完全能够解决这个问题
看一下的这个式子
1010 1010 0100 0101 式子1 0111 1111 式子2
0100 0101
如果式子2 固定 , 那么如果按照同一得1 来计算 , 最大的值算出来就是0111 1111, 而式子2是数组长度-1, 那么得到的结果不就正好是 数组对应的索引最大值吗?
问题二之:数组长度必须是2的n次幂
偶数必然是二进制末尾位是0 , 而奇数的末尾必然是1, 我们还是借助于之前的二进制
1010 1010 0100 010X 式子1 0111 1111 式子2
0100 0101
注意:我在的式子一最后一位写的是x
式子2 是(n-1) , n是一个偶数 , 那么(n-1)一定是一个奇数 , 那么由于&的存在 , 最终的index 值 , 就有可能最后的结果 就是有可能是个偶数页有可能是个奇数 , 至于算出来到底是个偶数还是个奇数 , 那么就由你的式子一决定啦~~
四、总结 好了 , 哥们门 , 如果以后面试官问你 , map的哈希冲突是怎么一回事 , 怎么答 , 你应该知道了吧 , 希望大家通过学习能有所收获