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不一致,排序集的行为也是定义良好的;它只是没有遵守设置界面的总合同。
人们经常会被树集的这种行为咬到:例如。