其实对象比较的接口就这么两个, 了解清楚了什么时候该用哪个心里也就有了谱了,之前不太理解这两个,反正基本上没有将这
两个排序接口分别开,为了应付面试也就背了排序就用这两个接口就行了,至于具体的就没怎么了解过了,其实这是很不应该的
,为什么设计两个接口,自然是因为一个接口不能满足使用,废话说了这么多,接着就说说这两个接口的使用。
Comparable接口使用比较简单,直接使比较对象实现这个接口就行了,然后实现compareTo方法即可实现排序,其实这个接口应该满足
我们开发中的大部分场景。(貌似也就这么一种用法)
@Override
public int compareTo(Person o) {
return this.getAge() - o.getAge();
}
还有一种就是Comparator接口,看其他博客都将Comparator排序接口叫做【外部比较器】,而将Comparable排序接口叫做【内部比较器】,
这么说基本没啥大问题,顾名思义,也就是说Comparable用在排序类的内部,Comparator用在排序类的外部。
就我的理解而言,在什么场景下使用Comparator呐?一般是被比较的对象没有实现Comparable接口,然而又想按照某种我们自定义的规则进行
比较,但是又不能修改那个类本身,Comparator就是适合这种场景,新建一个类实现Comparator接口(如PersonComp),实现compare方法,
排序的时候就可以用:
1.对象数组,用Arrays.sort(people,new PersonComp()); 2.集合,用Collections.sort(people,new PersonComp())
不过这似乎有点麻烦,专门为一个排序写一个类,然后只实现一个方法,大财小用了,没关系,我们还可以用如下这种方式使用Comparator接口
Arrays.sort(people,new Comparator<Person>() {
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
对应的people集合就可以用
Collections.sort(people,new Comparator<Person>() {
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
另外,其实Comparator也是可以当作【内部比较器】来用的,比如类Person也可以实现Comparator接口,然后实现compare方法,只是在调用
的时候注意也要用对应的Comparator的调用方式才是,比如Arrays.sort(people,new Person())。(people是Person类型的数组,并且实现了Comparator接口)
不过.....既然可以修改排序对象类,干嘛不用Comparable呐?哈哈,所以上述方法有点鸡肋了,不过主要说明的是它也可以这么用而已。