使用平等和对象进行对象比较可比的界面

时间:2014-01-17 14:23:06

标签: java

有人可以解释一下,在比较对象,特别是它们的值时,下面的代码是否有任何差异。

代码1

x.equals(y)

代码2

x.compareTo(y) == 0

以上代码是否可以互换。有什么区别?

3 个答案:

答案 0 :(得分:2)

来自Comparable

  

强烈建议,但并非严格要求   (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

见这里:Java Strings: compareTo() vs. equals()