String hashCode 方法为什么选择数字31作为乘子
1、IntelliJ IDEA怎么使用@Contract注释
什么是@Contract注解:
注释通过定义方法参数和返回值之间的依赖关系,为您的代码带来更多的安全性。该信息为源代码提供了更智能的控制流分析,并有助于避免可能出现的错误。
这个注释只能用于IDEA来检查可能的错误,Java编译器将几乎完全忽略它(它将在编译的工件中,但不起作用)。
2、推导公式
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
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;
}
注意这里的31并未写成常量形式。
3、使用31的原因
- 31是一个不大不小的质数,是作为 hashCode 乘子的优选质数之一。
- 31可以被 JVM 优化,31 * i = (i << 5) - i,计算更快。
注:
具体实验分析见:String hashCode 方法为什么选择数字31作为乘子