如果我不需要覆盖equals方法,是否需要重写HashCode方法?

4

我有一个名为“Position”的自定义类。我想使用以下内容:

Set<Position> s=new HashSet<Position>();

我需要在Position类中覆盖HashCode()方法吗?我没有覆盖equals()方法。我希望仅当两个Position对象是同一个对象时才被视为相等。我仍然需要覆盖HashCode()方法才能像上面的示例那样使用HashSet吗?

3个回答

4

只有在您希望不同的对象(可能表示相同的事物)被视为相等时,才需要覆盖 hashcode equals

(要澄清的是,如果您覆盖了其中一个,则应该覆盖另一个,以便测试为相等的对象始终具有相同的hashcode。)


1

是的!覆盖其中一个而不是另一个是非常糟糕的风格,会创建难以调试的微妙错误。在Object [1]的JavaDoc中记录了一份合同,应该遵守这个合同符合您自己的利益。如果您想了解更多信息,请阅读非常好的书Effective Java [2]中的第7项。

编辑:对不起,我看错了。如果您没有覆盖其中之一,则无需执行任何操作。仍然,阅读该书中的内容是一个好主意。实现这两种方法总是一个好主意。


0
如果您正在使用Map,那么有一个特殊的类叫做IdentityHashMap,专门用于此目的,即在比较键时使用引用相等性而不是对象相等性。

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