Objects.equals和Object.equals

时间:2015-12-28 01:56:59

标签: java equals

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

事情是,我知道Object.equals是默认的,它仍然会基于像" =="这样的引用进行比较,所以我不太确定我可以使用它。我查看了对象,其中有一个equals()。这个仍然可以在引用上进行比较,还是在内容上进行比较?

快速想象返回语句如下:

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

其中prev和next是元组的元素。这会有用吗?

3 个答案:

答案 0 :(得分:49)

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

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

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

答案 1 :(得分:0)

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

关于第二个问题,关于在具有prev和next作为其tupple属性的类似tupple的类中实现equals的答案是:只有在以下情况下,建议的实现才有效 prev和next是基元,或者它们的类型是否正确实现。 因此,例如,如果prev的类型为Foo,则只有在Foo类实现的预期值相等时,才可以使用Objects.equals测试两个Foo。

答案 2 :(得分:-3)

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