【问题标题】:Object comparison using equality & comparable interface [duplicate]使用相等和可比较接口进行对象比较[重复]
【发布时间】:2014-01-17 14:23:06
【问题描述】:

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

代码 1

x.equals(y)

代码 2

x.compareTo(y) == 0

上面的代码可以互换吗?如果有,有什么区别?

【问题讨论】:

  • It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y)). Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact. The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."
  • "当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2 ) 对于 C 类的每个 e1 和 e2。注意 null 不是任何类的实例,并且 e.compareTo(null) 应该抛出 NullPointerException 即使 e.equals(null) 返回 false。"

标签: java


【解决方案1】:

来自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      
 } 
}

【讨论】:

【解决方案2】:

compareTo 并不总是有意义,有时对象 无法在逻辑上排序。
另请注意,equals 始终存在,因为它是在 Object 类中定义的。

当你有compareTo 时,总是有equals 方法是一个好习惯,它们应该是一致的。

您可能还想看看this question

【讨论】:

    【解决方案3】:

    字符串不能互换。

    x.equals((String)null)  returns false
    

    代码 2

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

    请看这里:Java Strings: compareTo() vs. equals()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      相关资源
      最近更新 更多