2011-08-03 147 views
2

可能重复:
Why does Java's hashCode() in String use 31 as a multiplier?重载hashCode最佳实践

@Override public int hashCode() { 
    int result = 17 + hashDouble(re); 
    result = 31 * result + hashDouble(im); 
    return result; 
} 

这是 “有效的Java” 的代码。它广泛用于企业应用程序吗?我很担心添加静态值。或者我们应该将17和31定义为某种Utility类中的最终变量,并从那里引用它们?

也可以有人解释这些数字是什么? 31只是一个随机选择的素数?

回答

0

是的,我总是看到这样的代码。

我认为这种做法没有任何问题,我也没有看到有利于将常量分解到外部类中(请注意,在程序运行时,值显然不能改变)。

这些数字是可能在某种程度上被任意选择的质数。

我没有有效的Java手,但我发现下面的话:选择

值31,因为它是一个奇素数。如果它甚至是 并且乘法溢出,信息将会丢失,因为 乘以2相当于移位。使用 素数的优点不太清楚,但它是传统的。 31的一个不错的属性是 ,乘法可以被移位和减法 替代以获得更好的性能:31 * i ==(i < < 5) - i。现代虚拟机会自动执行这种优化。