`
bingooh
  • 浏览: 53277 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics