大家都知道,int型的值取值范围为
Integer.MIN_VALUE(-2147483648)~Integer.MAX_VALUE(2147483647)
hash结果取到负数时怎么修改呢?
可以想到取绝对值,但是若恰好是Integer.MIN_VALUE取绝对值,就会导致时int正数发生了溢出!!
Math.abs(Integer.MIN_VALUE) = Integer.MAX_VALUE+1(溢出)
看来这样行不通,如果对hash做数据偏移,统一加2147483647呢?No no,这样更是错误,因为更会发生数据溢出,会产生负数,有一种牛逼的办法就是使用位与操作:
hash = key.hashCode() & Integer.MAX_VALUE; // caution, make value not minus
对于计算得到的hash值,强制把符号位去掉,保证结果只在正数区间,至此,把hashcode关进笼子了,问题解决。