我最近必须覆盖Java中的equals
和hashCode
方法。因此,我寻找一种快速有效的方法来计算哈希码。
Java开发人员似乎对以下方法有所了解:
int hash = 23;
hash = hash * 37 + paramOne;
hash = hash * 37 + paramTwo;
// And so on...
这可能是简单的算术,但我并没有真正得到它。什么是保证?角落案件有哪些?是否有更好(相当简单)的方法呢?
谢谢!
答案 0 :(得分:2)
这是关于主要因素。看看this answer。
如果你只是在寻找快速方式和实用的方法,并且你对性能没有任何重大关注,请查看Apache Commons Lang HashCodeBuilder或类似的库函数。
equals
有一个equivalent builder。
答案 1 :(得分:2)
用Joshua Bloch的话来解释hashCode()
类中String
method的默认实现,即:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
):
选择值31是因为它是奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以2相当于移位。使用素数的优势不太明显,但它是传统的。 31的一个很好的特性是乘法可以用移位和减法代替以获得更好的性能:31 * i ==(i <&lt; 5) - i。现代虚拟机会自动执行此类优化。
答案 2 :(得分:1)
Joshua Bloch告诉你如何在他的“Effective Java”的第3章中正确地覆盖equals和hashCode。谷歌为它阅读它。
他是编写集合API的人,现在是 Google的首席Java架构师。这对我来说足够权威。