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()
方法
我的问题:
- 为什么我更喜欢 Guava 的 19
hashCode()
而不是 Java 的 8?
- 我可以完全依靠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
- array creation (*)
- 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);
}
你可以采取的应对措施是
- 缓存计算的哈希码而不是每次都重新计算
and/or
- 延迟初始化它。
(但也要记住,过早的优化是万恶之源)。
或者:
只需使用您的 IDE 即可为您生成它(节省时间,但样板代码仍然存在)。在 IntelliJ 中:Code > Generate > equals() and hashCode()
考虑添加 Project Lombok 作为依赖项
在Java8中有一个classjava.util.Objects
,其中包含hashCode()
方法。同时GoogleGuava 19包含com.google.common.base.Objects
,其中也有hashCode()
方法
我的问题:
- 为什么我更喜欢 Guava 的 19
hashCode()
而不是 Java 的 8? - 我可以完全依靠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
- array creation (*)
- 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);
}
你可以采取的应对措施是
- 缓存计算的哈希码而不是每次都重新计算 and/or
- 延迟初始化它。
(但也要记住,过早的优化是万恶之源)。
或者:
只需使用您的 IDE 即可为您生成它(节省时间,但样板代码仍然存在)。在 IntelliJ 中:
Code > Generate > equals() and hashCode()
考虑添加 Project Lombok 作为依赖项