我尝试创建一个允许Java中类似元组的结构的元组类。元组中两个元素的一般类型分别是X和Y.我试图覆盖这个类的正确等号。
事情是,我知道Object.equals是默认的,它仍然会基于像" =="这样的引用进行比较,所以我不太确定我可以使用它。我查看了对象,其中有一个equals()。这个仍然可以在引用上进行比较,还是在内容上进行比较?
快速想象返回语句如下:
return Objects.equals(compared.prev, this.prev) && Objects.equals(compared.next, this.next);
其中prev和next是元组的元素。这会有用吗?
答案 0 :(得分:49)
不同之处在于Objects.equals()
认为两个空值“相等”。伪代码是:
null
或同一个对象,请返回true
null
返回false
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方法。