两个对象的hashCode()相同,那么他们的内容一定相同吗?
首先不一定,因为可能会产生 哈希冲突,产生一样的哈希值,但内容不相同。
1. java中计算hashCode的方法
public static int hashCode(byte[] value) {
int h = 0;
int length = value.length >> 1;
for (int i = 0; i < length; i++) {
h = 31 * h + getChar(value, i);
}
return h;
}
采用31哈希法,将数组中的每个元素都乘以31,然后累加,这样计算出HashCode
2. 为什么使用31作为乘数?
主要有三个方面:
-
素数只能被自己和本身整除,因此,当乘数为素数时,结果的公因子数量较少,不容易产生哈希冲突。
-
奇数做乘法有一个好处,就是不容易产生溢出,即产生进位,导致信息丢失。
-
为了尽可能产生较小的数字溢出,要选择尽可能小的奇素数,而31作为一个奇素数,可以使用更为高效的移位操作表示:
$(i << 5) - 1$
而其它奇素数并不具备这种效果,如:2、3、5、7、11、13、17、19、23、29等