我有一个关于使用equals的HashMap性能的问题。当我将null-check放在第一位时,如下所示:
public boolean equals(final Object obj) {
// object must be Test at this point
if (obj == null) {
return false;
}
}如果我不这样做,它会更快一点。
所以,要创建HashMap -我只是想知道-与HashMap中的元素相比,是什么类型的元素。当我进行put、insert或get操作时,我从不插入任何null对象。
谢谢!
发布于 2013-01-21 14:32:54
我真的不会担心单个if语句的成本--这是一个微优化,除非你有文档证明它是你程序中的瓶颈,否则你绝对不应该担心它。几乎普遍的是,程序的减速是由于更大范围的低效,而不是个别的if语句。
如上所述,存储在HashMap中的对象可以进行比较,但是HashMap想要比较它们。这通常是在插入、删除和查找期间完成的,以便HashMap知道两个对象是否相等,但也可以在重新散列期间完成(因为对象是通过HashMap重新分配的)。该实现甚至可能尝试将您的对象与null进行比较,然后执行某种疯狂的激进缓存或合并方案,以提高内存使用率。你真的不能假设太多,因为HashMap的契约的一部分是equals必须为你的对象工作。
此外,如果您不支持equals中的null,那么您就是breaking the contract for equals as specified in Object,它明确提到传入的null应该返回false。正如前面提到的,这几乎肯定是一个非常糟糕的想法,除非你有可验证的数据表明这是一个瓶颈。
希望这能有所帮助!
发布于 2013-01-21 14:45:49
在大多数现代CPU上,正确预测分支的null检查实际上是免费的。说真的,你不应该担心这个。
但通常在这种情况下,我会先进行instanceof检查,这使得null检查变得不必要:
public boolean equals(final Object obj) {
if (obj instanceof MyObject) {
// do comparison
} else {
return false
}
}请注意,您不需要显式的null检查:对于不是有效MyObject实例的任何其他内容,else子句的处理方式与返回false的方式相同。
https://stackoverflow.com/questions/14433398
复制相似问题