java.lang.Compariable和equals

java.lang.Compariable和equals,java,equals,comparable,Java,Equals,Comparable,如果我为一个类实现了java.lang.Comparable,我还需要重写equals()方法吗?或者可比较的是否也适用于等于 如果答案是否定的,那么如果出现一些差异怎么办?假设我在equals()方法中将两个对象称为相等的方式不同于在Comparable的compareTo()方法中将同一类的两个对象称为相等的方式 此外,如果我实现了Comparable,我是否也必须重写equals()?虽然建议(而且非常合理)将a.compareTo(b)==0表示a.equals(b)(visa反之亦然)

如果我为一个类实现了
java.lang.Comparable
,我还需要重写
equals()
方法吗?或者
可比较的
是否也适用于
等于

如果答案是否定的,那么如果出现一些差异怎么办?假设我在
equals()
方法中将两个对象称为相等的方式不同于在
Comparable
compareTo()
方法中将同一类的两个对象称为相等的方式

此外,如果我实现了
Comparable
,我是否也必须重写
equals()

虽然建议(而且非常合理)将
a.compareTo(b)==0
表示
a.equals(b)
(visa反之亦然),但这不是必需的
Comparable
用于对一系列对象执行排序,而
equals()
仅用于测试直接相等

有一些关于正确实现
比较的好信息。

来自以下的Javadoc:

强烈建议(尽管不是必需的)自然顺序与equals一致


虽然建议使用,但不要求
.equals()
.compareTo()
具有相同的行为

请看BigDecimal API:

假设我在equals()中将两个对象称为相等 方法不同于我为同一类的两个对象命名的方式 在可比的toCompare()范围内相等

如果执行此操作,并将这些对象放入一个排序集,则该集将出现异常行为:

请注意,由排序集维护的排序(无论 如果 排序集合是为了正确实现集合接口

例如,可能(错误地)包含两个对象,其中

a.compareTo(b) != 0
即使

a.equals(b) == true

+1这里有一个到相关有效Java章节的链接(见第11项)@MByD感谢链接。它(毫不奇怪)说得比我好@谢谢你的链接。直接调用a.compareTo(b)或compare()可以吗?@aps-为什么不可以?请注意-如果您重写equals()方法,还必须重写hashCode()方法。@如果在代码中的某个点上您想知道
a
b
的比较,然后就可以开始了。所有
TreeSet
操作都是使用
compareTo
-执行的,因此比较返回的对象是
!=0
被认为是不同的,并且比较返回的对象是相同的(因此只有添加到集合中的第一个对象被实际保留)。正如Javadoc所说:
即使排序与equals不一致,排序集的行为也是定义良好的;它只是没有遵守设置界面的总合同。
人们经常会被
树集的这种行为咬到:例如。