Guava.Objects.hashCode 对比 Java.Objects.hashCode

Guava.Objects.hashCode vs Java.Objects.hashCode

在Java8中有一个classjava.util.Objects,其中包含hashCode()方法。同时GoogleGuava 19包含com.google.common.base.Objects,其中也有hashCode()方法

我的问题:

  1. 为什么我更喜欢 Guava 的 19 hashCode() 而不是 Java 的 8?
  2. 我可以完全依靠Java 8 hashCode()还是留在Guava更好?

Guava 的方法早于' Java 7.

同名的Java方法只接受一个参数。但是同级 java.util.Objects.hash() 接受可变数量的参数,就像 Guava 的 Objects.hashCode().

如果您使用的是 Java 7 或更高版本,则可以使用 java.util.Objects.hash(...)Guava documentation 注意到这一点:

Note for Java 7 and later: This method should be treated as deprecated; use Objects.hash(java.lang.Object...) instead.

如果您使用的是 Java 6 或更早版本,则可以使用 Guava 的方法。

要添加到已接受的答案中:

虽然在 Java 7+ 代码中 Objects.hash() 应该比 Guava 更受欢迎,但请注意以下内容(转述)来自 Joshua Bloch 的 Effective Java 第三版(第 11 项):

Unfortunately, Objects.hash() runs more slowly because it entails

  1. array creation (*)
  2. boxing and unboxing of any primitive arguments

It is recommended for use only in situations where performance is not critical.

(*) 实际上,Objects.hash() 只是在幕后调用另一个静态方法:

public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }

你可以采取的应对措施是

  1. 缓存计算的哈希码而不是每次都重新计算 and/or
  2. 延迟初始化它。

(但也要记住,过早的优化是万恶之源)。

或者:

  1. 只需使用您的 IDE 即可为您生成它(节省时间,但样板代码仍然存在)。在 IntelliJ 中:Code > Generate > equals() and hashCode()

  2. 考虑添加 Project Lombok 作为依赖项