【问题标题】:Equals() method is called on existing object or incoming object in collections对集合中的现有对象或传入对象调用 Equals() 方法
【发布时间】:2012-05-16 22:31:37
【问题描述】:

当我们检查集合的相等性时,任何人都可以澄清一下,equals() 方法是在传入对象或集合中的那些对象上调用的。例如。 如果 Set 或 Hashmap 具有对象 object1、object2 和 object3,并且名为 object4 的第四个对象尝试进入 Set,或者在 hashmap 的情况下与已经存在的三个对象进行比较,则在第四个对象上调用 equals() 方法和已经存在的三个对象一一传递或者反向为真。?

【问题讨论】:

  • 您能否向我们展示一些代码,向我们展示您正在尝试做的事情,以便我们更了解这一点?
  • 你为什么不看源代码而不相信陌生人的话?
  • @dty:你为什么推荐它?在这种情况下,从标准 API 查看类的源代码是非常危险的,因为您最终可能会依赖于实现特定的细节。
  • OPs 问题是特定于实现的 - 否则它将包含在 JavaDoc 中

标签: java collections hashmap set


【解决方案1】:

答案并不重要(并且可能在实现之间有所不同),因为根据合同,A.equals(B) 当且仅当B.equals(A)。不遵守此合同会导致收藏品出现奇怪和不连贯的行为。

【讨论】:

    【解决方案2】:

    没有办法知道,除非您正在考虑一个非常具体的集合实现。你不应该依赖它。 equals 方法应该是自反的,即x.equals(y) 应该给出与y.equals(x) 相同的结果,除非其中之一为空。

    【讨论】:

      【解决方案3】:

      a.equals(b) 和 b.equals(a) 之间应该没有区别(如果 a 和 b 不为 null )equals 应该是对称的。无法保证使用什么形式(a.equals(b) 或 b.equals(a))。

      【讨论】:

        【解决方案4】:

        嗯...正如我刚刚在 eclipse 中检查的那样,调用了传入对象的 equals() 方法。 Eclipse 通过参考。传入对象的equals()方法中的预先存在的对象一一对应。 我知道你们都在说,在 Sun 的 equals() 方法契约中,equals 方法应该是自反的、对称的和传递的。 当我认为如果以某种方式主动检查两个引用(正在检查是否相等)是否指向同一个对象时,集合可能会更加优化时想到了这个问题。如果是,那么绕过 equals() 和 hashcode() 方法确实有意义。

        【讨论】:

        • 请使用 cmets 进行进一步解释,答案是为了回答问题而不是解释你累了什么。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 2016-04-13
        • 2016-10-11
        相关资源
        最近更新 更多