comparable 和 Comparator的区别
(1) Comparable接口实际上是出自java.lang包,它有一个compareTo(Object obj)方法来排序
(2) Comparator接口实际上是出自java.util包,它有一个compare(Object obj1,Object obj2)方法来排序
一般需要对一个集合使用自定义排序时,就要重写CompareTo方法或者compare()方法
对一个集合进行自定义排序的两种实现方法
场景:对下面的Student进行排序,排序规则:先按照名字排序,名字相同按照年龄排序
Student代码片
// 自定义的学生类
public class Student {
private String name;
private int age;
.....
//get(),set()方法、toString(),有参构造等方法省略
}
方法一:使用匿名内部类的形式重写Comparator接口的compare()方法:
Collections.sort(students, new Comparator<Student>(){
@Override
public int compare(Student s1, Student s2) {
if(s1.getName()!=s2.getName()){
//名字不等,按照名字排序(默认升序)
return s1.getName().compareTo(s2.getName());
}else {
//名字相等,按照年龄升序排序
return s1.getAge()-s2.getAge();
}
}
});
方法二:Student类中实现Comparable接口,并重写compareTo()方法
public class Student implements Comparable<Student> {
private String name;
private int age;
.....g
//get(),set()方法、toString(),有参构造等方法省略
@Override
public int compareTo(Student s) {
if (this.getName() != s.getName()) {
//名字进行比较,默认升序
return this.getName().compareTo(s.getName());
} else {
//比较年龄
return this.getAge() - s.getAge();
}
}
}
// 调用排序方法,如果Student类中没有重写Comparable接口的compareTo()方法则会出错
Collections.sort(students);
两种实现方法的比较:
方法一:匿名内部类的方式,需要使用的时候,再重写方法,可以自己定义重写的规则,适用于一个集合在不同场景下不同排序的规则。
方法二:在Student类中已经重写了重写Comparable接口的compareTo()方法,规则已经固定了,适合固定的排序规则的情况下。
部分内容来自网络,侵删。