java - 使用 Objects#hash(Object...) 作为 hashCode 方法?

标签 java java-7

您认为使用 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 用户。

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


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

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

最佳答案

IntegerDoubleBoolean这样的包装类确实实现了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/

相关文章:

ssl - JDK 7 SSL 连接问题忽略不支持的密码套件 : TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

Java 7 将在 Mac 上以 32 位运行

Java数组矩阵数

java - Executors.newFixedThreadPool(1) 和 Executors.newSingleThreadExecutor() 之间的区别

java - 解决这个错误 "The import java.util.Random conflicts with a type defined in the same file"

即使在 Eclipse 中使用 JDK 1.7,java.nio.file 也无法正常工作

java - Windows 批处理文件 - 检查 JAVA_HOME 是否包含 java 7

java - WatchService/dectect 重命名和/或移动

java - 如何在recyclerview中放置横幅

java - 使用 Berkeley DB API 作为 Spring+JPA 应用程序 (DB2) 的缓存解决方案