我有一个名为Position的自定义类。我想使用以下内容: -
Set<Position> s=new HashSet<Position>();
我必须覆盖Position类中的HashCode()方法吗?我没有重写equals()方法。我希望两个Position对象只有在它们是同一个对象时才被视为相等。我是否仍然必须重写HashCode()才能使用如上所示的HashSet?
答案 0 :(得分:4)
如果您希望将不同的对象(可能代表相同的对象)计算为相等,则只需覆盖hashcode
和equals
。
(澄清一下,如果你覆盖了一个,你应该覆盖另一个,这样测试相等的对象总是具有相同的哈希码。)
答案 1 :(得分:1)
是的!覆盖其中一个而不是另一个是非常糟糕的风格,并将创建难以调试的细微错误。对象[1]的JavaDoc中记录了一个合同,并且该合同应该符合您自己的利益。如果您想了解更多相关信息,请阅读非常好的书Effective Java [2]的第7项。
编辑:抱歉,我读错了。如果您没有覆盖其中一个,则无需执行任何操作。不过,请阅读本书中的内容。实现这两种方法总是一个好主意。答案 2 :(得分:0)
如果您使用的是Map,那么有一个名为IdentityHashMap的特殊类,它专门为此目的而构建,即在比较键时使用引用相等性代替对象相等。