如果我重写equals并且不使用任何散列集合,是否有必要覆盖hashcode

时间:2012-05-11 05:53:25

标签: java equals hashcode

我有一个对象,我只想覆盖 equals 方法来比较两个对象,我没有在我的程序中的任何地方使用任何散列集合。在这种情况下,为什么hashCode和equals方法中存在契约,即如果两个对象相等则它们应该具有相同的哈希码。 一般的hashcode契约不应该是特定于case的,如果你想把这个对象作为键放在一些使用散列的集合中,然后覆盖它?

3 个答案:

答案 0 :(得分:2)

我会说是的,因为您不知道您(或更重要的是,另一位开发人员)是否希望将来使用散列将它们放入集合中。这可以是直接的,也可以是间接的,即你可以将你的对象传递给另一个不是你编写的方法,而另一个方法在它的实现中使用一个散列集合。

答案 1 :(得分:1)

它被视为良好做法(或强制性),因为您无法确定其他人(或您下个月)会重复使用您的课程。

例如,需要equals的对象有资格用作键,因此需要hashcode。

您可以将其视为约定,如缩进或参数和类名称的情况,但这种约定有助于管理代码。有人看到equals方法将正确地假设哈希码方法(可能在超类中)。不要让他感到惊讶(这是一般规则)。

也就是说,你有很多帮助库来制作haschode方法,你可以在你的IDE中获得灵感(例如,Eclipse有一个生成equals和hashcode方法的函数,非常冗长,但在检查后大部分都可用)并修复它们。)

答案 2 :(得分:0)

如果您要重新定义equals,则应重新定义hashCode,但不需要投入太多精力。只需选择您喜欢的号码(8675309或其他),只需让您的hashCode方法返回即可。这样做可确保在插入对象时散列集合的行为正确(尽管很慢)。