首先,两者都是比较器,主要用来对集合进行排序。
废话不多说,直接上代码,来看看两者的区别
Comparable
public interface Comparable<T> {
public int compareTo(T o);
}
可以看出Comparable是一个接口,里面只有一个方法compareTo
public class Student implements Serializable, Comparable<Student> {
private static final long serialVersionUID = 1L;
public int age;
public int num;
public String name;
public Book1 book;
public int compareTo(Student o) {
if (this.age > o.age) {
return 1;
} else {
return -1;
}
}
}
public class Test6 {
public static void main(String[] args) {
Student s1=new Student();
s1.age=18;
Student s2=new Student();
s2.age=16;
Student s3=new Student();
s3.age=20;
List<Student> list=new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).age);
}
}
}
输出结果
16
18
20
结果分析
我们知道ArrayList的输出顺序应该是输入的顺序,但由于Student类实现了Comparable接口,并且重写了compareTo方法,故在方法内部将Student按照age排序了。
Comparator
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
。。。。其他方法
}
Comparator也是一个接口,不过里面有很多方法,我们只需要关心其中一个方法compare(Student o1, Student o2)即可
这里有个疑问?
我们都知道,接口中的方法必须是抽象的,但这个Comparator虽然是接口,但它的方法确有body。
public class StudentComparator implements Comparator<Student> {
public int compare(Student o1, Student o2) {
if (o1.age > o2.age) {
return 1;
} else {
return -1;
}
}
}
public class Test6 {
public static void main(String[] args) {
Student s1=new Student();
s1.age=18;
Student s2=new Student();
s2.age=16;
Student s3=new Student();
s3.age=20;
List<Student> list=new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list,new StudentComparator());
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).age);
}
}
}
输出结果
16
18
20
结果分析
通过实现Comparator也可以实现排序
总结一下Comparable和Comparator的区别
- 前者需要待排序的类实现该接口,后者是方法调用的一个参数
- 前者实现compareTo方法,后者实现compare方法
- 总体上区别不大,哪个顺手用哪个即可,不过有一点,并不是所有的类都是可修改的,这时就可以通过Comparator接口来实现对该类的排序。
网友评论