原文链接:https://blog.csdn.net/weixin_55371011/article/details/124550506
如果两个元素不相同,但是hash函数的值相同,这两个元素就是一个碰撞。
因为把任意长度的字符串变成固定长度的字符串,所以存在一个hash对应多个字符的情况,所以碰撞必然存在
为了减少hash值的碰撞,需要实现一个尽量均匀分布的hash函数,在HashMap中通过利用key的hashcode值,来进行位运算
公式:index = e.hash & (newCap - 1)
举个例子:
1.计算"book"的hashcode
十进制 : 3029737
二进制 : 101110001110101110 1001
2.HashMap长度是默认的16,length - 1的结果
十进制 : 15
二进制 : 1111
3.把以上两个结果做与运算
101110001110101110 1001 & 1111 = 1001
1001的十进制 : 9,所以 index=9
hash算法最终得到的index结果,取决于hashcode值的最后几位
为了推断HashMap的默认长度为什么是16
现在,我们假设HashMap的长度是10,重复刚才的运算步骤:
hashcode : 101110001110101110 1001
length - 1 : 1001
index : 1001
再换一个hashcode 101110001110101110 1111 试试:
hashcode : 101110001110101110 1111
length - 1 : 1001
index : 1001
从结果可以看出,虽然hashcode变化了,但是运算的结果都是1001,也就是说,当HashMap长度为10的时候,有些index结果的出现几率
会更大而有些index结果永远不会出现(比如0111),这样就不符合hash均匀分布的原则
反观长度16或者其他2的幂,length - 1的值是所有二进制位全为1,这种情况下,index的结果等同于hashcode后几位的值
只要输入的hashcode本身分布均匀,hash算法的结果就是均匀的
所以,HashMap的默认长度为16,是为了降低hash碰撞的几率
结果
-
使用位与运算计算效率高
-
设置容量为2的幂指数,避免了hash碰撞产生链表,使得结果可以均匀分布
-
提高了查询效率
博客探讨了HashMap中哈希冲突的原因和处理方式。通过位与运算计算索引,确保均匀分布以减少碰撞。文章指出HashMap的默认长度选择16是为达到更好的哈希分布,提高查询效率。长度设为2的幂可以避免某些index出现概率不均的问题。
6661

被折叠的 条评论
为什么被折叠?



