您认为使用 Objects#hash(Object...)
怎么样?在 hashCode()
方法?
int a = 1;
boolean b = true;
Date c = new Date();
String d = "1234";
Object e = new ch.example.blabla.Foo();
// Java 7
public int hashCode() {
return Objects.hash(a, b, c, d, e);
}
// or using Java 6
public int hashCode() {
return Arrays.hashCode(new Object[] {a, b, c, d, e});
}
当然在正常情况下比如有equals(Object)
方法等等。约书亚·布洛赫(Joshua Bloch)在他的书中写道如何写好文章hashCode()
使用他的规则/配方的方法,例如移位等。
上面的示例不遵循这些原始数据类型的规则...所以我的问题是,是否可以处理像对象(自动装箱)这样的原始数据类型,而不是遵循 Bloch 的食谱或使用 Apache Commons HashCodeBuilder
?
Objects#hash(Object...)
在 Java 7 中引入并仅调用 Arrays.hashCode(Object[])
,所以这个问题也主要针对 Java 6 用户。
感谢您的回复/想法/建议!
我真的不明白什么时候旧问题会因为新问题而被作为重复问题而关闭。
但是,这里有一个问题有更好的答案:
最佳答案
像Integer
、Double
和Boolean
这样的包装类确实实现了Joshua Bloch的Effective Java中描述的规则。感谢 Marko Topolnik 强调了这一点。
他还提到了一个可能导致性能问题的缺点。然而,Jörn Horstmann 认为这可能会被现代 JVM 优化。
我们将采用这种方法 (Objects.hash(a, b, c)
),因为它比编写我们自己的 hashCode()
方法更具可读性。如果确实有必要(如果我们遇到性能问题),我们会自己实现原始哈希码。
Marko、Jörn,感谢您的评论。如果您要写答案,我会将已接受的答案更改为最佳答案。
关于java - 使用 Objects#hash(Object...) 作为 hashCode 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13138802/