TreeMap,TreeSet,Arrays,Collections可能调用实现了Comparable接口的对象的compareTo()进行自然排序。实现compareTo()与实现equals()基本原则类似,不同点包括:
1.如果传入的比较对象的类型与当前对象不同,应抛出ClassCastException
2.如果x.compareTo(y)==0,那么应该x.equals(y)==true
BigDecimal没有遵守规则2,以下测试将通过,这可能导致以下2个BigDecimal对象可以同时放入一个HashSet对象里(因为equals()返回false),但是只能有其中一个放入TreeSet里(因为compareTo()返回0)
@Test
public void testCompareTo(){
BigDecimal decimal1=new BigDecimal("1.0");
BigDecimal decimal2=new BigDecimal("1.00");
Assert.assertFalse(decimal1.equals(decimal2));
Assert.assertTrue(decimal1.compareTo(decimal2)==0);
Set<BigDecimal> hashSetContainer=new HashSet<BigDecimal>();
Set<BigDecimal> treeSetContainer=new TreeSet<BigDecimal>();
hashSetContainer.add(decimal1);
hashSetContainer.add(decimal2);
treeSetContainer.add(decimal1);
treeSetContainer.add(decimal2);
Assert.assertTrue(hashSetContainer.size()==2);
Assert.assertTrue(treeSetContainer.size()==1);
}
需要注意的地方:
1.对于2个正数int i,j。i为最大正整数,j为最小的负整数。在比较时,如果使用i-j,那么可能造成存储溢出并返回负数,从而导致比较结果不正确(因为i比j大,应返回正数)
2.推荐使用Apache Commons的CompareToBuilder实现比较逻辑