我有一个名为“Position”的自定义类。我想使用以下内容:
Set<Position> s=new HashSet<Position>();
我需要在Position类中覆盖HashCode()方法吗?我没有覆盖equals()方法。我希望仅当两个Position对象是同一个对象时才被视为相等。我仍然需要覆盖HashCode()方法才能像上面的示例那样使用HashSet吗?
只有在您希望不同的对象(可能表示相同的事物)被视为相等时,才需要覆盖 hashcode
和 equals
。
(要澄清的是,如果您覆盖了其中一个,则应该覆盖另一个,以便测试为相等的对象始终具有相同的hashcode。)
是的!覆盖其中一个而不是另一个是非常糟糕的风格,会创建难以调试的微妙错误。在Object [1]的JavaDoc中记录了一份合同,应该遵守这个合同符合您自己的利益。如果您想了解更多信息,请阅读非常好的书Effective Java [2]中的第7项。
编辑:对不起,我看错了。如果您没有覆盖其中之一,则无需执行任何操作。仍然,阅读该书中的内容是一个好主意。实现这两种方法总是一个好主意。