2

我有一个HashMap关于使用equals. 当我首先进行空检查时,如下所示:

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

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

所以,要创建HashMap- 我只是想知道 - 与HashMap. 当我放置、插入或获取时,我从不插入任何null对象。

谢谢!

4

2 回答 2

5

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

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

此外,如果您不支持nullin equals,那么您将违反in 中指定的合同equalsObject,其中明确提到传入null应该返回false。如前所述,这几乎可以肯定是一个非常糟糕的主意,除非您有可验证的数据表明它是一个瓶颈。

希望这可以帮助!

于 2013-01-21T06:32:53.847 回答
3

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

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

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

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

于 2013-01-21T06:45:48.957 回答