如果我不需要覆盖equals,则覆盖HashCode

时间:2011-07-29 19:35:09

标签: java equals hashcode hashset

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

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

我必须覆盖Position类中的HashCode()方法吗?我没有重写equals()方法。我希望两个Position对象只有在它们是同一个对象时才被视为相等。我是否仍然必须重写HashCode()才能使用如上所示的HashSet?

3 个答案:

答案 0 :(得分:4)

如果您希望将不同的对象(可能代表相同的对象)计算为相等,则只需覆盖hashcodeequals

(澄清一下,如果你覆盖了一个,你应该覆盖另一个,这样测试相等的对象总是具有相同的哈希码。)

答案 1 :(得分:1)

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

编辑:抱歉,我读错了。如果您没有覆盖其中一个,则无需执行任何操作。不过,请阅读本书中的内容。实现这两种方法总是一个好主意。

答案 2 :(得分:0)

如果您使用的是Map,那么有一个名为IdentityHashMap的特殊类,它专门为此目的而构建,即在比较键时使用引用相等性代替对象相等。