有人可以解释一下,在比较对象,特别是它们的值时,下面的代码是否有任何差异。
代码1
x.equals(y)
代码2
x.compareTo(y) == 0
以上代码是否可以互换。有什么区别?
答案 0 :(得分:2)
强烈建议,但并非严格要求 (x.compareTo(y)== 0)==(x.equals(y))。一般来说,任何课程 实现Comparable接口并违反此条件 应该清楚地表明这一事实。推荐的语言是“注意: 这个类的自然顺序与equals不一致。“
@ZouZou提到
C类的自然排序据说是一致的 当且仅当e1.compareTo(e2)== 0具有相同的布尔值时才等于 作为类C的每个e1和e2的e1.equals(e2)。注意null不是 任何类的实例,e.compareTo(null)应抛出一个 NullPointerException,即使e.equals(null)返回false。
这意味着它们不可互换。
在java api中发生这种情况的示例位于BigDecimal
import java.math.BigDecimal;
public class Test{
public static void main(String args[]) {
BigDecimal big = BigDecimal.ZERO;
BigDecimal zero = new BigDecimal("0.00");
System.out.println("Compare "+ (big.compareTo(zero) == 0) ); //prints true
System.out.println("Equals "+big.equals(zero)); // prints false
}
}
答案 1 :(得分:1)
compareTo
并不总是有意义,有时对象 不能在逻辑上排序。
另请注意,equals
始终存在,因为它是在Object
类中定义的。
当您拥有compareTo
时,始终使用equals
方法是一种很好的做法,并且它们应该保持一致。
另外,您可能需要查看this question。
答案 2 :(得分:0)
字符串不可互换。
x.equals((String)null) returns false
代码2
x.compareTo((String)null) == 0 // throws a NullPointerException