为什么在Java中需要重写equals和hashCode方法?

528

最近我阅读了这篇Developer Works文档

该文档主要介绍了如何有效和正确地定义hashCode()equals()方法,但是我不明白为什么需要覆盖这两个方法。

我该如何决定高效地实现这些方法?


1
仅使用Case Override重写equals方法: 两个相同的对象将具有不同的哈希码 = 相同的对象进入不同的桶(重复)。 仅使用Case Override重写hashcode方法: 两个相同的对象将具有相同的哈希码 = 相同的对象进入同一个桶(重复)。 - VedantK
链接似乎已经失效了。我能获取IBM的开发者文档吗? - tahasozgen
31个回答

-3

Bah - "如果你重写了equals()方法,那么你必须在每个重写equals()的类中覆盖hashCode()方法。"

[来自Joshua Bloch的《Effective Java》?]

这不是应该相反的吗?重写hashCode()通常意味着你正在编写一个散列键类,但重写equals()肯定不是。有许多类不用作哈希键,但确实需要某些其他原因的逻辑相等性测试方法。如果你为此选择“equals”,则可能被过度应用此规则强制编写hashCode()实现。所有这些都会在代码库中添加未经测试的代码,这是一种将来可能会使某些人困扰的恶行。写不需要的代码也是反敏捷的。这是错误的(并且IDE生成的可能与您手工制作的equals不兼容)。

无论如何,我认为这个“规则”写反了。与此同时,我会继续避免使用“equals”进行相等性测试方法 :-(

当然,他们应该要求对象实现用于键的接口。无论如何,在我看来,Object永远不应该提供默认的hashCode()和equals()。这可能会鼓励很多破碎的哈希集合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接