java中的Object类的hashCode方法是一个native方法,查看native源码过于困难,所以暂且认为 Object类的hashCode生成规则是:hash(对象的内存地址+一些其他信息)
java中String类的 hashCode方法 比较直观,源码如下:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
生成规则:s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
为什么是素数31?
素数:根据素数的特点,一个数与素数相乘,得到结果只能被1、这个数、素数本身整除。因此,按照 s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1] 生成的hashCode越不容易发生碰撞。
31:哈希计算速度快。可用移位和减法来代替乘法。现代的VM可以自动完成这种优化,如31 * i = (i « 5) - i。
参考:
评论