最近我阅读了这篇Developer Works文档。
该文档主要介绍了如何有效和正确地定义hashCode()
和equals()
方法,但是我不明白为什么需要覆盖这两个方法。
我该如何决定高效地实现这些方法?
最近我阅读了这篇Developer Works文档。
该文档主要介绍了如何有效和正确地定义hashCode()
和equals()
方法,但是我不明白为什么需要覆盖这两个方法。
我该如何决定高效地实现这些方法?
Bah - "如果你重写了equals()方法,那么你必须在每个重写equals()的类中覆盖hashCode()方法。"
[来自Joshua Bloch的《Effective Java》?]
这不是应该相反的吗?重写hashCode()通常意味着你正在编写一个散列键类,但重写equals()肯定不是。有许多类不用作哈希键,但确实需要某些其他原因的逻辑相等性测试方法。如果你为此选择“equals”,则可能被过度应用此规则强制编写hashCode()实现。所有这些都会在代码库中添加未经测试的代码,这是一种将来可能会使某些人困扰的恶行。写不需要的代码也是反敏捷的。这是错误的(并且IDE生成的可能与您手工制作的equals不兼容)。
无论如何,我认为这个“规则”写反了。与此同时,我会继续避免使用“equals”进行相等性测试方法 :-(
当然,他们应该要求对象实现用于键的接口。无论如何,在我看来,Object永远不应该提供默认的hashCode()和equals()。这可能会鼓励很多破碎的哈希集合。