【问题标题】:Objects.equals and Object.equalsObjects.equals 和 Object.equals
【发布时间】:2015-12-28 01:56:59
【问题描述】:

我尝试创建一个允许在 Java 中使用类似元组的结构的元组类。元组中两个元素的一般类型分别是 X 和 Y。我尝试为此类覆盖正确的等号。

事情是,我知道 Object.equals 属于默认值,它仍然基于“==”之类的引用进行比较,所以我不太确定我可以使用它。我查看了 Objects ,其中有一个 equals() 。这个还是比较参考文献,还是比较内容?

很快就把return语句想象成这样:

return Objects.equals(compared.prev, this.prev) && Objects.equals(compared.next, this.next);

prev 和 next 是元组的元素。这行得通吗?

【问题讨论】:

  • 您可以阅读内置 JRE 类的源代码。

标签: java equals


【解决方案1】:

不同之处在于Objects.equals() 认为两个空值是“相等的”。伪代码为:

  1. 如果两个参数都是null或者同一个对象,返回true
  2. 如果第一个参数是null,则返回false
  3. 将第二个参数传递给第一个参数的equals()方法返回结果

这意味着它是“空安全的”(尽管第一个参数的 equals() 方法的非空安全实现)。

【讨论】:

  • 第 2 点记录不正确。代码是:return (a == b) || (a != null && a.equals(b)); 所以它实际上是 如果 first 参数是 null return false。如果第二个是null,则使用null 参数调用您的equals。如果你实现了你的equals 错误,这可能会感兴趣,这取决于Objects.equals 一个 null 太远了,就像我做的那样。
【解决方案2】:

这是来自 java 源代码的文字代码:如您所见,@Agent_L 是正确的

【讨论】:

    【解决方案3】:

    您的问题的答案“这个 [Objects.equals] 是否仍然在引用上进行比较,还是在内容上进行比较?” - Objects.equals 对引用进行了一些比较,但它希望第一个参数的类实现 equals(),其中内容的比较以及引用完成。

    关于在具有 prev 和 next 作为其元组属性的类元组中实现 equals 的第二个问题是:您建议的实现仅在以下情况下才有效 prev 和 next 是原语,或者如果它们的类型实现正确等于。 因此,如果 prev 例如是 Foo 类型,那么只有当 Foo 类按预期实现 equals 时,您才能使用 Objects.equals 来测试这两个 Foo。

    【讨论】:

      【解决方案4】:

      Objects.equals 只是调用它的第一个参数 .equals 方法。在 java 中,如果您希望能够在您创建的类的实例中测试相等性,那么您必须重写 equals 方法。 instance.equals() 仅在该实例类型未覆盖 equals 方法时才使用 ==。

      【讨论】:

      • 别忘了也覆盖hashCode
      • 不,它不会那样做。
      猜你喜欢
      • 2013-12-11
      • 2012-04-03
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多