equals在Java HashMap中的作用

时间:2013-01-21 06:29:32

标签: java data-structures null hashmap

我对HashMap有关使用equals的表现提出疑问。当我首先进行空检查时,如下所示:

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

如果我没有,那会快一点。

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

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

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

希望这有帮助!

答案 1 :(得分:3)

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

通常在这种情况下我会先进行instanceof检查,这样就无需进行空检查:

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

请注意,您不需要显式空检查:else子句处理此方法的方式与对非有效MyObject实例的其他任何内容返回false的方式相同。< / p>