Guava.Objects.hashCode与Java.Objects.hashCode的区别

9
在Java 8中有一个名为java.util.Objects的类,其中包含hashCode()方法。与此同时,Google Guava 19包含com.google.common.base.Objects,它也有hashCode()方法。
我的问题:
1.是否有任何理由我应该优先使用Guava 19的hashCode()而不是Java 8的?
2.我是否可以完全依赖于Java 8的hashCode(),还是最好使用Guava?

1
你认为Guava实现比新的内置实现更好,为什么?同时,请定义“更好”的含义。 - Tunaki
2
这个类自Java 7以来就存在。 - Alexis C.
也许,Guava的哈希是基于更好/其他哈希函数的? - Mike
2
就像许多其他事情一样,Java从Guava或其他库中插入基类的功能。这发生在Optional类中,该类首先出现在Guava中,然后添加到Java8中,还有许多集合工具和哈希码等。您可以简单地查看源代码以查看是否有不同的实现。在我看来,如果您已经使用了Guava方法,我不会费力进行迁移。如果您没有并且想要使用此方法,则尽可能使用内部Java。 - Nir Levy
2个回答

16

Guava的方法早于Java 7。

同名的Java方法只接受单个参数。但是,一个类似Guava的Objects.hashCode()的兄弟java.util.Objects.hash()接受可变数量的参数。

如果您使用的是Java 7或更高版本,则可以使用java.util.Objects.hash(...)Guava文档指出:

针对Java 7及更高版本:应将此方法视为已弃用;请改用Objects.hash(java.lang.Object...)。

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


1
补充一下已接受的答案:
虽然在Java 7+代码中应该优先选择使用Objects.hash()而不是Guava,但请注意以下内容(摘自Joshua Bloch的《Effective Java第三版》第11项):

不幸的是,Objects.hash()运行速度较慢,因为它需要执行以下操作:

  1. 数组创建(*)
  2. 任何基本类型参数的装箱和拆箱

建议仅在性能不关键的情况下使用。

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

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

你可以采取以下措施来应对这种情况:
  1. 缓存计算出的哈希码,而不是每次重新计算。
  2. 进行延迟初始化。
(但也要记住,过早优化是万恶之源)。
或者:
  1. 使用IDE自动生成代码(节省时间,但样板代码仍然存在)。在IntelliJ中: Code > Generate > equals() and hashCode()
  2. 考虑将Project Lombok添加为依赖项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接