java - 使用 Objects.hash() 还是自己的 hashCode() 实现?

标签 java hash

我最近发现了 Objects.hash()方法。

我的第一个想法是,这会大大整理您的 hashCode() 实现。请参阅以下示例:

@Override
//traditional
public int hashCode() {
    int hash = 5;
    hash = 67 * hash + (int)(this.id ^ (this.id >>> 32));
    hash = 67 * hash + (int)(this.timestamp ^ (this.timestamp >>> 32));
    hash = 67 * hash + Objects.hashCode(this.severity);
    hash = 67 * hash + Objects.hashCode(this.thread);
    hash = 67 * hash + Objects.hashCode(this.classPath);
    hash = 67 * hash + Objects.hashCode(this.message);
    return hash;
}

@Override
//lazy
public int hashCode() {
    return Objects.hash(id, timestamp, severity, thread, classPath, message);
}

虽然我不得不说这似乎好得令人难以置信。我也从未见过这种用法。

与实现自己的哈希码相比,使用 Objects.hash() 有什么缺点吗?我什么时候会选择这些方法?

更新

尽管此主题已标记为已解决,但请随时发布提供新信息和疑虑的答案。

最佳答案

注意Objects.hash的参数是Object...。这有两个主要后果:

  • 哈希码计算中使用的原始值必须装箱,例如this.idlong 转换为 Long
  • 必须创建一个 Object[] 来调用该方法。

如果经常调用 hashCode,创建这些“不必要”对象的成本可能会增加。

关于java - 使用 Objects.hash() 还是自己的 hashCode() 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45832458/

相关文章:

java - ImageIO.read 返回 NULL,没有错误

c# - 为什么 String GetHashCode 只处理每四个字符?

php - 与盐渍 SHA512 相比,盐渍 SHA1 有多不安全

arrays - 反转数组中键、值的顺序转换为哈希

java - Neo4j SPARQL 插件 REST 使用

java - 在 solr 5.1.0 中找不到用于配置的正确 solrconfig.xml 文件

c# - string.GetHashCode() 会返回负值吗?

perl - 为什么在 Perl 中访问数组和散列元素时需要 $?

java - 为什么 lambda 类型推断失败,但等效方法引用成功?

java - Action配置中包路径不能以 "java "开头