hashCode方法:默认为包名+地址值,如果我们需要计算哈希值时,必须重写该方法,返回值一个32位的二进制
上图可以看出,计算出的hashCode值赋值给了h;
32位的二进制从中间分割,左16位为高16位,右16位为低16位
>>> : 无符号右移,无论最高位是0还是1,左边补齐0;
^ : 位异或运算,相同则0,不同则1;一个数据对另一个数据位异或两次,该数本身不变。
因为二进制下运算需要每一位都对齐,为了有效利用每一位进行计算,减少哈希碰撞,方法中将32位的hashCode向右位移16位,将高16位和低16位进行位异或操作,能够尽可能让0,1平均。
上图可以看出,n为当前容量,而HashMap的容量必须为2的次幂,由此可知(n-1)必定为一个奇数,那么它的二进制第一位也必定是1;
那么为什么要一个一定为奇数的值呢?
&:位与运算,有0则0。
根据位与运算的规则我们可以得知,如果取一个偶数和hash进行位与运算,那么二进制的第一位一定是0,即偶数,这样就会导致计算得出的存储位置永远是偶数,导致存入的值不能均匀的分布;而是一个奇数的话得到的结果就有可能是奇数也有可能是偶数,而不是全部是偶数,并且可以更加充分利用hashCode。