比较器中的equals()vs compareTo()/能(理论)

时间:2012-05-31 12:29:35

标签: java collections equals comparator comparable

我不明白Javadoc:

The natural ordering for a class C is said to be consistent with equals if and only if
  (e1.compareTo((Object)e2) == 0) has the same boolean value as e1.equals((Object)e2) for
  every e1 and e2 of class C.

为什么要那样?

我知道e1.equals(e2)= true应该始终意味着e1.compareTo(e2)== 0,但我无法理解为什么相反应该是真的。比较不平等! 2个相等的对象应该与零进行比较,但是如果排序标准与它们的情况无关,则2个不同的对象应该能够比较0。我的意思是,让不同的对象等于不正确,但不同的对象与0比较为什么不呢?

编辑:后来它表示强烈建议使用一致性问题,因此存在问题

4 个答案:

答案 0 :(得分:7)

Javadoc没有说它是错误的进行与equals不一致的比较。它只是定义了与equals一致的比较术语。

当你得到选择时,通常很好的做出与equals一致的比较,这样给定A和B,A小于,等于或大于B - 但它没有' 以这种方式工作。

非常重要,你记录了这一点 - 调用者可能会对一个意外与equals不一致的排序感到非常困惑。

答案 1 :(得分:3)

他们只是谈论自然秩序。您可能会遇到其他类型的订单

答案 2 :(得分:0)

java doc谈论自然排序。你可以自由地比较它们。但如果它是关于自然排序那么你不想,它必须是两种方式?

即使每天50个月到达我们可以看到整数的自然顺序被逆转,也没有;)

答案 3 :(得分:0)

作为示例考虑BigDecimal类,在此类中,方法equalscompareTo彼此之间不一致:

等于文件说:

  

public boolean equals(Object x)

     

将此BigDecimal与指定的Object进行相等性比较。   与 compareTo 不同,此方法认为两个BigDecimal对象相等   只有它们的价值和规模相等(因此2.0不等于   2.00用这种方法比较时。)