我对HashMap
有关使用equals
的表现提出疑问。当我首先进行空检查时,如下所示:
public boolean equals(final Object obj) {
// object must be Test at this point
if (obj == null) {
return false;
}
}
如果我没有,那会快一点。
所以,要创建HashMap
- 我只是想知道 - 与HashMap
中的元素相比有哪些元素。当我放置,插入或获取时,我从不插入任何null
个对象。
谢谢!
答案 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>