1

我有一个对象,我只想重写equals方法来比较两个对象,我没有在程序中的任何地方使用任何散列集合。在这种情况下,为什么在 hashCode 和 equals 方法中有一个合同,即如果两个对象相等,那么它们应该具有相同的 hashcode。如果您想将此对象作为某个使用散列然后覆盖它的集合中的键,那么一般哈希码合同不应该是特定情况吗?

4

3 回答 3

2

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

于 2012-05-11T05:58:19.857 回答
1

这被认为是一种很好的做法(或强制性的),因为您不能确定没有其他人(或下个月的您)会重用您的课程。

例如,需要等于的对象才有资格用作键,因此需要哈希码。

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

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

于 2012-05-11T05:57:50.683 回答
0

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

于 2012-06-01T22:42:54.737 回答