Java equal()和hashCode()基于不同的字段?

Fla*_*vio 19 java netbeans

是否有任何情况下,一个类使用不同的类字段集来实现它equals()hashCode()方法是否有意义?

我问,因为我对Netbeans equals()hashCode()生成器感到困惑,在那里你被要求选择分别包含在每个方法中的字段.我总是最终为这两种方法选择相同的字段,但有没有这种情况不是正确的选择?

Jon*_*eet 23

好吧,equals() 必须使用所有使用的字段hashCode(),否则你可以获得相同对象的不同哈希码.反之亦然 - 您可以选择在选择哈希码时不考虑一个特定字段.这样,您可能会得到两个不相等的对象的相同哈希码,这两个对象仅与"未使用"字段不同(而不是通过自然冲突).你只想知道在你知道碰撞不太可能的情况下,你会在很多地方进行散列.我想这是非常罕见的:)

另一种情况是你有某种自定义的相等比较 - 例如不区分大小写的字符串比较 - 在​​这里为字段生成哈希码很棘手或者很昂贵.同样,这将导致更多碰撞的可能性,但是有效.