3.12 考虑实现Comparable接口

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实现比较逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值