为什么要实现Comparable接口
对于普通的数值或者字符串,都可以进行一定的排序。但是,能不能直接给对象进行排序呢?答案当然是不能的了,实际上,之所以我们可以对数值和字符串进行排序,是因为系统内部已经为我们定义了数值和字符串的排序关系。而我们定义的对象,本身是不包含排序关系的,因此,我们无法直接对对象进行排序。
类实现了Comparable接口,就表明他的实例具有内在的排序关系
compareTo方法的通用约定于equals方法的相似
- 实现者必须确保所有的x和y都满足sng(x.compareTo(y)) = =-sng(y.compareTo(x))
- 实现着必须确保这个比较关系是可传递的 x.compareTo(y)>0,y.compareTo(z)>0 ,x.compareTo(z)>0
- 实现着必须确保x.compareTo(y) ==0 暗示着所有的z都满足 x.compareTo(z) == y.compareTo(z)
强烈介意(x.compareTo(y)==0 ) == (x.equals(y)
考虑BigDecimal类,它的equals方法和compareTo方法不一致,如果你创建了一个HashSet实例,并且添加new BigDecimal(“1.0”)和newBigDecimal(“1.00”)这个集合就将包含两个元素,因为通过equals方法判断时候是不相等的,当你TreeSet来执行同样的过程,集合中将包含一个元素,因为他们的compareTo方法是相等的。
compareTo 方法的比较
compareTo方法中域的比较是顺序比较的,而不是等同性的比较,如果一类有多个关键域,那么你可以从最关键的域开始,依次比较
@Override
public int compareTo(Person o) {
if (id > o.id)
return 1;
if (id < o.id)
return -1;
//id相等的情况下,对age进行排序
if (age > o.age)
return -1;
if (age < o.age)
return 1;
//若id和age相等,则直接通过名字来进行排序。
return name.compareTo(o.name);
}
以上这个方法就是先按照id进行比较,id相等后比较age,最后再按照名字进行比较(该类实现了Comparable接口
)
网友评论