覆盖hashCode的最佳实践

3

可能是重复问题:
为什么Java中String的hashCode()方法使用31作为乘数?

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

这是《Effective Java》中的代码。企业应用程序中广泛使用吗?我担心添加静态值。或者我们应该将17和31定义为某种实用程序类中的final变量,并从那里引用它们?
另外,有人能解释一下这些数字的作用吗?31只是随机选择的素数吗?
1个回答

0

是的,我经常看到这样的代码。

我认为这种做法没有问题,而且我不认为将常量分解成外部类有任何好处(请注意,这些值在程序运行时显然不会改变)。

这些数字是质数,很可能是随意选择的。

我手头没有《Effective Java》,但我找到了以下引用:

选择值31是因为它是一个奇质数。如果它是偶数并且乘法溢出,则会丢失信息,因为乘以2等同于移位。使用质数的优点不太清楚,但这是传统的做法。 31的一个好处是可以通过移位和减法替换乘法以获得更好的性能:31 * i == (i << 5) - i。现代VM会自动进行此类优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接