Guava.Objects.hashCode与Java.Objects.hashCode

问题描述 投票:6回答:2

在Java 8中,有一个类java.util.Objects,其中包含hashCode()方法。同时,Google Guava 19包含com.google.common.base.Objects,也具有hashCode()方法。

我的问题:

  1. 有什么理由比Java 8更喜欢Guava的19 hashCode()吗?
  2. 我可以完全依靠Java 8 hashCode()还是最好还是继续使用Guava?
java java-8 guava hashcode
2个回答
15
投票

Guava的方法早于Java 7。

同名的Java方法仅接受一个参数。但是同级java.util.Objects.hash()接受可变数量的参数,例如番石榴的Objects.hashCode()

[如果使用Java 7或更高版本,则可以使用java.util.Objects.hash(...)Guava documentation注意:

对于Java 7及更高版本的说明:此方法应视为不推荐使用;使用Objects.hash(java.lang.Object ...)代替。

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


0
投票

要添加到接受的答案中:

虽然在Java 7+代码中Objects.hash()应该比番石榴更受青睐,但请注意以下内容(改写自Joshua Bloch的Effective Java 3rd Edition(条款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添加为依赖项

© www.soinside.com 2019 - 2024. All rights reserved.