如果我选择永远不将我的对象存储在集合中,我是否需要覆盖哈希码或者我的对象可以使用相同的哈希码?表现好坏?
答案 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将无法正常工作。
是。如果可以改进默认实现,则覆盖哈希码。