【发布时间】:2011-05-25 10:28:21
【问题描述】:
对于字段完全是原始的类,例如:
class Foo
{
int a;
String b;
boolean c;
long d;
boolean equals(Object o)
{
if (this == o) return true;
if (!(o instanceof Foo)) return false;
Foo other = (Foo) o;
return a == other.a && b.equals(other.b) && c == other.c && d = other.d;
}
}
这是写hashCode() 的合理“足够好”的方式吗?
boolean hashCode()
{
return (b + a + c + d).hashCode();
}
也就是说,我用equals() 使用的相同字段构造了一个String,然后只使用String#hashCode()。
编辑:我更新了我的问题,加入了long 字段。 long 在hashCode() 中应该如何处理?就让它溢出int?
【问题讨论】:
-
虽然效率不高,但应该可以正常工作,因为任何两个具有所有相同内部值的实例都将具有相同的哈希码。
-
它将正常工作我不知道它的性能问题,但它肯定会工作。如果您想更进一步,请阅读:ibm.com/developerworks/java/library/j-jtp05273.html
-
只要用commons-lang's HashCodeBuilder就不用担心这种事情了
-
@Spoon:感谢您的评论,尽管我认为这与手头的问题并不完全相关
-
@SpoonBender:你说得很好,但是由于 Matt 只是一个消费者,并且不涉及 Java 规范,所以在这个问题的上下文中它真的无关紧要,除非它会以某种方式更改他问题的“正确”答案。他是否应该根据 HashCode 不应该与 Object 类相关联的知识以某种方式对 Java 代码进行不同的编程?