【问题标题】:Java Linked List .contains methodJava 链表 .contains 方法
【发布时间】:2015-07-03 14:19:30
【问题描述】:

我有一个包含 A 类型元素的 LinkedList。 我需要检查列表是否包含基于某些条件的元素。

重写 A 类中的 .equals 方法是否足够,还是我还需要重写 hash 方法?

【问题讨论】:

  • 当您尝试覆盖 equals 时发生了什么?
  • 如果你覆盖 equals 你也必须覆盖 hashCode
  • 记住一般约定 - 如果两个对象在 equals() 方法的意义上是相等的,那么它们必须hashCode() 返回相同的值。
  • 我试过了,它似乎可以工作,但是我的算法中有很多可能出错的地方,我不想冒险。
  • 设置是否过于严格?

标签: java list equals contains


【解决方案1】:

当您的 Object 将用于使用哈希的数据结构中时,您需要重写 hashCode() 方法。 HashMap、HashSet等

并不是说您必须实现 hashCode() 函数。许多数据结构只使用 equals() 方法,而不使用 hashCode() 函数,所以你可以不去实现它。

但是你不能真正保证没有人会将它放入另一个使用 hashCode() 函数的数据结构中,所以从一开始就实现它可能是一个好习惯。

【讨论】:

    【解决方案2】:

    您不必重写 hashCode,但相等的对象应该具有相同的 hashcode。我的建议:如果您使用 eclipse,请右键单击该类,转到源代码,生成 equals() 和 hashcode(),然后选择必须相等的变量。这是最简单的方法。

    【讨论】:

    • 谢谢。我从来不知道 eclipse 可以做到这一点。
    【解决方案3】:

    equals() 方法应该只用于告诉对象的身份是什么。

    如果用于查找您要查找的对象的标准与用于定义对象身份的标准完全匹配,那么调用Listcontains() 方法就可以了,该方法依赖于equals()

    在任何其他情况下,您应该循环遍历列表并执行手动比较。或者,您可以使用提供过滤功能的 Java8 Streams。

    【讨论】:

      【解决方案4】:

      您必须知道,通过实现equals 方法,您定义了一个等价 关系,即将这个类的所有对象细分为等价类。当有许多对象满足您的条件时,它们都将被视为相等,并且它们都必须具有相同的 hashCode。因此,当您在某个时候将这些对象放入 HashMap 中时,所有这些对象最终都会在同一个槽中,从而导致性能不佳的退化 HashMap。

      即使您不打算将对象放在 HashMap 中,这似乎也是反对实施 equals 以根据更广泛的标准进行比较的有力论据。

      您必须确保您的实现满足等价的联系,即它必须是自反的、对称的和传递的。 Joshua Bloch 的标准书《Effective Java》有详细的解释。

      必须在实现equals 时实现hashCode,因为每两个相等的对象都必须具有相同的哈希码(有关详细说明,请参阅this post)。

      【讨论】:

        猜你喜欢
        • 2019-05-09
        • 2014-08-20
        • 2018-03-22
        • 2019-05-03
        • 2013-12-02
        • 2017-08-31
        • 2013-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多