2

您如何看待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 CommonsHashCodeBuilder吗?

Objects#hash(Object...)在 Java 7 中引入并且仅调用Arrays.hashCode(Object[]),所以这个问题也针对 Java 6 用户。

感谢您的回复/想法/建议!


我真的不明白什么时候旧的问题因为新的问题而被重复关闭。

但是,这里有一个问题有更好的答案

4

1 回答 1

3

包装类如Integer,确实实现了 Joshua Bloch 的 Effective Java 中描述的规则DoubleBoolean感谢 Marko Topolnik 强调这一点。

他还提到了可能导致性能问题的不利因素。然而,Jörn Horstmann 假设这可能会被现代 JVM 优化。

我们将采用这种方法 ( Objects.hash(a, b, c)),因为它比编写我们自己的hashCode()方法更具可读性。如果真的有必要(如果我们遇到性能问题),我们会自己实现原始哈希码。

Marko,Jörn,感谢您的评论。如果您要写答案,我会将已接受的答案更改为最佳答案。

于 2012-11-07T07:42:36.047 回答