Guava.Objects.hashCode与Java.Objects.hashCode

Guava.Objects.hashCode与Java.Objects.hashCode,java,java-8,guava,hashcode,Java,Java 8,Guava,Hashcode,在Java8中有一个类Java.util.Objects,它包含hashCode()方法。同时,Google Guava 19包含com.Google.common.base.Objects,它还包含hashCode()方法 我的问题: 有什么理由让我更喜欢Guava的19hashCode()而不是Java的8 我可以完全依赖Java 8hashCode()吗?还是最好还是继续使用番石榴 Guava的方法早于Java7 同名的Java方法只接受一个参数。但是同级java.util.Objects

在Java8中有一个类
Java.util.Objects
,它包含
hashCode()
方法。同时,Google Guava 19包含
com.Google.common.base.Objects
,它还包含
hashCode()
方法

我的问题:

  • 有什么理由让我更喜欢Guava的19
    hashCode()
    而不是Java的8
  • 我可以完全依赖Java 8
    hashCode()
    吗?还是最好还是继续使用番石榴

  • Guava的方法早于Java7

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

    如果您使用的是Java7或更高版本,那么可以使用
    Java.util.Objects.hash(…)
    。委员会注意到:

    注意:对于Java7和更高版本:此方法应视为已弃用;改为使用Objects.hash(java.lang.Object…)


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

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

    在Java 7+代码中,
    Objects.hash()
    应优先于番石榴,请注意Joshua Bloch的《有效Java第三版》(第11项)中的以下内容(意译):

    不幸的是,
    Objects.hash()
    运行得更慢,因为它需要

  • 数组创建(*)
  • 任何基元参数的装箱和拆箱
  • 建议仅在性能不理想的情况下使用 关键的

    (*)实际上,
    Objects.hash()
    只是在引擎盖下调用另一个静态方法:

    public static int hash(Object... values) {
            return Arrays.hashCode(values);
        }
    
    您可以做的是

  • 缓存计算出的哈希代码,而不是每次重新计算 和/或
  • 懒洋洋地初始化它 (但也要记住,过早优化是许多弊病的根源)

    或者:

  • 只需使用IDE为您生成它(节省时间,但样板代码仍然存在)。在IntelliJ中:
    code>Generate>equals()和hashCode()

  • 考虑将添加作为依赖项


  • 为什么您认为Guava实现会比新内置的更好?另外,定义“better”这个类是因为Java 7可能,Guava的hash是基于better/other hash函数的?像许多其他东西一样,Java将Guava或其他库的特性插入基类中。这发生在guava中第一个添加到java8中的可选类、许多集合UTIL等,以及hashcode中。您只需查看源代码,看看是否有不同的实现。在我看来,如果你已经在使用番石榴方法,我就不会陷入迁移的麻烦。如果您不喜欢并且想使用这种方法,我更喜欢在可能的情况下使用内部java