首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >equals在Java的HashMap中的作用

equals在Java的HashMap中的作用
EN

Stack Overflow用户
提问于 2013-01-21 14:29:32
回答 2查看 112关注 0票数 2

我有一个关于使用equalsHashMap性能的问题。当我将null-check放在第一位时,如下所示:

代码语言:javascript
复制
public boolean equals(final Object obj) {
    // object must be Test at this point
    if (obj == null) {
        return false;
    }
}

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

所以,要创建HashMap -我只是想知道-与HashMap中的元素相比,是什么类型的元素。当我进行put、insert或get操作时,我从不插入任何null对象。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 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。正如前面提到的,这几乎肯定是一个非常糟糕的想法,除非你有可验证的数据表明这是一个瓶颈。

希望这能有所帮助!

票数 5
EN

Stack Overflow用户

发布于 2013-01-21 14:45:49

在大多数现代CPU上,正确预测分支的null检查实际上是免费的。说真的,你不应该担心这个。

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

代码语言:javascript
复制
public boolean equals(final Object obj) {
    if (obj instanceof MyObject) {
        // do comparison
    } else {
        return false
    }
}

请注意,您不需要显式的null检查:对于不是有效MyObject实例的任何其他内容,else子句的处理方式与返回false的方式相同。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14433398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档