【问题标题】:The role of equals in Java's HashMapJava的HashMap中equals的作用
【发布时间】:2013-01-21 06:29:31
【问题描述】:

我对@9​​87654321@ 使用equals 的性能有疑问。当我先放空检查时,如下所示:

public boolean equals(final Object obj) {
    // object must be Test at this point
    if (obj == null) {
        return false;
    }
}

如果我不这样做会快一点。

所以,创建HashMap - 我只是想知道 - 与HashMap 中的元素相比,什么样的元素。当我放置、插入或获取时,我从不插入任何 null 对象。

谢谢!

【问题讨论】:

    标签: java data-structures null hashmap


    【解决方案1】:

    我真的不会担心单个 if 语句的成本 - 这是一个微优化,除非您有文档证明它是您程序中的瓶颈,否则您绝对不应该担心它。几乎普遍地,程序的放缓是由于大规模的低效率而不是个别的 if 语句。

    话虽如此 - 可以比较存储在 HashMap 中的对象,但是 HashMap 想要比较它们。这通常在插入、删除和查找期间完成,以便HashMap 知道两个对象是否相等,但也可以在重新哈希期间完成(因为对象通过HashMap 重新分配)。该实现甚至可能会尝试将您的对象与null 进行比较,然后执行某种疯狂的激进缓存或合并方案以提高内存使用率。你真的不能假设太多,因为HashMap 的部分合同是equals 必须适用于你的对象。

    此外,如果你在equals 中不支持null,那么你就是breaking the contract for equals as specified in Object,其中明确提到传入null 应该返回false。如前所述,这几乎可以肯定是一个非常糟糕的主意,除非您有可验证的数据表明这是一个瓶颈。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      在大多数现代 CPU 上,正确进行分支预测的空值检查几乎是免费的。说真的,你不应该担心它。

      尽管在这种情况下,我通常会先进行instanceof 检查,这使得空检查变得不必要:

      public boolean equals(final Object obj) {
          if (obj instanceof MyObject) {
              // do comparison
          } else {
              return false
          }
      }
      

      请注意,您不需要显式检查空值:else 子句处理此问题的方式与它为任何不是有效的 MyObject 实例的其他任何内容返回 false 的方式相同..

      【讨论】:

        猜你喜欢
        • 2013-02-17
        • 1970-01-01
        • 2015-04-10
        • 2013-09-21
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多