Java 使用equality&;可比界面

Java 使用equality&;可比界面,java,Java,有谁能解释一下,在比较对象和更具体地说它们的值时,下面的代码是否有任何区别 代码1 x.equals(y) 代码2 x.compareTo(y) == 0 x.compareTo((String)null) == 0 // throws a NullPointerException 上述代码是否可互换。有什么区别吗?来自 强烈建议,但并非严格要求 (x.与(y)==0)==(x.等于(y))。一般来说,任何阶级 实现可比较接口并违反此条件的 应明确指出这一事实。建议使用“注意: 此类具有与

有谁能解释一下,在比较对象和更具体地说它们的值时,下面的代码是否有任何区别

代码1

x.equals(y)
代码2

x.compareTo(y) == 0
x.compareTo((String)null) == 0 // throws a NullPointerException
上述代码是否可互换。有什么区别吗?

来自

强烈建议,但并非严格要求 (x.与(y)==0)==(x.等于(y))。一般来说,任何阶级 实现可比较接口并违反此条件的 应明确指出这一事实。建议使用“注意: 此类具有与equals不一致的自然顺序。”

正如@ZouZou提到的

C类的自然顺序与 等于当且仅当e1.compareTo(e2)==0具有相同的布尔值时 对于C类的每一个e1和e2,都等于(e2)。注意null不是 任何类的实例,e.compareTo(null)应抛出 即使e.equals(null)返回false,也会出现NullPointerException。

这意味着它们不能互换

在JavaAPI中发生这种情况的一个例子是

不总是有意义的,有时对象无法逻辑排序。
还要注意,
等于
始终存在,因为它是在
对象
类中定义的

当您与进行比较时,最好始终保持方法的一致性


另外,您可能还想看一看。

字符串不能互换

x.equals((String)null)  returns false
代码2

x.compareTo(y) == 0
x.compareTo((String)null) == 0 // throws a NullPointerException

请参见此处:

强烈建议(x.compareTo(y)=0)=(x.equals(y)),但不是严格要求。一般来说,任何实现可比较接口并违反此条件的类都应该清楚地指出这一事实。建议使用的语言是“注意:此类的自然顺序与equals不一致。”
“当且仅当e1.compareTo(e2)==0与e1.equals(e2)具有相同的布尔值时,类C的自然顺序才与equals一致。”对于类C的每个e1和e2。请注意,null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)也应引发NullPointerException。”类中
equals()
compareTo()
不一致的一个显著示例是确保重写hashCode()以与equals一致@维克多的建议不错,但与这个问题无关。