可能重复:
Why does Java's hashCode() in String use 31 as a multiplier?
@Override public int hashCode() {
int result = 17 + hashDouble(re);
result = 31 * result + hashDouble(im);
return result;
}
这是“Effective Java”中的代码。它是否广泛用于企业应用程序?我担心添加静态值。或者我们应该将17和31定义为某种Utility类中的最终变量并从那里引用它们?
也可以有人解释这些数字的用途吗? 31只是随机选择的素数吗?
答案 0 :(得分:0)
是的,我一直看到这样的代码。
我认为这种做法没有任何问题,我没有看到任何的好处将常量分解为外部类(请注意,在程序运行时,值显然不能改变)
数字是可能在某种程度上任意选择的素数。
我没有有效的Java,但我找到了以下引用:
选择值31是因为它是奇数素数。如果它是均匀的 并且乘法溢出,信息将丢失,如 乘以2相当于移位。使用的好处 素数不太清楚,但它是传统的。 31的不错的财产是 乘法可以用移位和减法代替 为了更好的性能:31 * i ==(i <&lt; 5) - i。现代VM执行此操作 自动进行优化。