如果我覆盖.equals(),即使我不使用HashMap,我是否需要覆盖.hashCode()?

时间:2011-11-21 18:01:49

标签: java

如果我选择永远不将我的对象存储在集合中,我是否需要覆盖哈希码或者我的对象可以使用相同的哈希码?表现好坏?

9 个答案:

答案 0 :(得分:5)

这并非绝对必要,但如果您决定稍后存储和排序对象,则最好这样做。

答案 1 :(得分:5)

绝对有必要吗?否。

这是最佳做法吗?是。

如果你在6个月内不这样做,它会回来咬你吗?也许

答案 2 :(得分:4)

Equal objects must have equal hash codes;这是任何一个班级的合同。

如果你觉得实施一个不错的hashCode方法太懒,你仍然可以遵守这个实现的合同:

  @Override public int hashCode() {
    return 0;
  }

它在基于散列的集合中表现不佳,但至少是正确的。

答案 3 :(得分:2)

如果您总是覆盖这些方法,那么您将不会花费太多精力,现代IDE为您提供此功能

答案 4 :(得分:1)

不,你应该提供哈希码。你永远不知道明天你可能需要在那里使用

答案 5 :(得分:1)

如果A.equals(B),则A.hashCode() == B.hashCode()必须为真。

如果!A.equals(B)A.hashCode() == B.hashCode()仍然可以为真。

如果在覆盖hashCode()时没有覆盖equals(),那么将内容放入某些集合中实际上会丢失对象(它们将无法检索)。因此,要么正确覆盖hashCode(),要么将其覆盖到return 1。这将满足约束并正常工作,但如果你开始将很多它们放在基于散列的集合中,那么性能会很糟糕。

答案 6 :(得分:1)

要解决这一问题:

  

表现好还是坏?

要么你需要它,要么你不需要它。如果您需要它,您没有选择。如果你不这样做,它永远不会被调用。

答案 7 :(得分:1)

其他一些人提到只返回一个常数值。如果您忘记并将其置于基于散列的集合中,这可能会导致稍后对性能的一些混淆。我会考虑抛出一个UnsupportedOperationException,这样如果你以后想要使用它,你会很快发现,所以你可以继续进行正确的实现。

答案 8 :(得分:0)

无论何时覆盖哈希码,您还需要覆盖等于。 Hashcode必须返回相同的值才能进行比较,其中equals返回true,否则hashmaps将无法正常工作。

是。如果可以改进默认实现,则覆盖哈希码。