【问题标题】:is it necessary to override hashcode if i am overriding equals and not using any hashing collection如果我覆盖equals而不使用任何散列集合,是否有必要覆盖hashcode
【发布时间】:2012-05-11 05:53:25
【问题描述】:

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

【问题讨论】:

  • 仅供参考:如果您使用的是 Eclipse 或 NetBeans 等现代 Java IDE,您可以让您的 IDE 为您生成 equals()hashCode() 方法,这几乎可以省去所有精力它。 IDE 在这方面做得很好。
  • 已经检查过这个链接,但它不能回答我的问题,如果我不使用任何散列集合并且没有其他人会处理我的代码,为什么要根据合同覆盖散列码
  • eclipse 可以为我做这件事我很清楚,但我想知道这份合同的具体原因。

标签: java equals hashcode


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-02
        • 1970-01-01
        • 2020-08-26
        • 2020-06-06
        • 1970-01-01
        • 2014-07-01
        • 2011-07-11
        • 1970-01-01
        相关资源
        最近更新 更多