美文网首页
JDK8的哈希冲突算法

JDK8的哈希冲突算法

作者: 柒浅丶Belief | 来源:发表于2019-07-28 17:25 被阅读0次
计算HashMap的存储位置

hashCode方法:默认为包名+地址值,如果我们需要计算哈希值时,必须重写该方法,返回值一个32位的二进制

上图可以看出,计算出的hashCode值赋值给了h;

32位的二进制从中间分割,左16位为高16位,右16位为低16位

>>> : 无符号右移,无论最高位是0还是1,左边补齐0;

^ : 位异或运算,相同则0,不同则1;一个数据对另一个数据位异或两次,该数本身不变。

因为二进制下运算需要每一位都对齐,为了有效利用每一位进行计算,减少哈希碰撞,方法中将32位的hashCode向右位移16位,将高16位和低16位进行位异或操作,能够尽可能让0,1平均。

计算存储位置 默认初始容量为16且必须为2的次幂

上图可以看出,n为当前容量,而HashMap的容量必须为2的次幂,由此可知(n-1)必定为一个奇数,那么它的二进制第一位也必定是1;

那么为什么要一个一定为奇数的值呢?

&:位与运算,有0则0。

根据位与运算的规则我们可以得知,如果取一个偶数和hash进行位与运算,那么二进制的第一位一定是0,即偶数,这样就会导致计算得出的存储位置永远是偶数,导致存入的值不能均匀的分布;而是一个奇数的话得到的结果就有可能是奇数也有可能是偶数,而不是全部是偶数,并且可以更加充分利用hashCode。

相关文章

网友评论

      本文标题:JDK8的哈希冲突算法

      本文链接:https://www.haomeiwen.com/subject/mprprctx.html