相同点
- 都是用来比较两个对象“顺序”的接口
不同点
- Comparable在java.lang包下,Comparator在java.util包下
- Comparable是在集合内部元素中定义的方法实现的排序,Comparator是在集合外部实现的排序,是策略模式。
具体实现
Comparable需要集合中存放的对象实现Comparable接口,重写comparaTo()方法
以Student类倒序排序举例:
public class Student implements Comparable<Student> {
public int age;
public String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Student s) {
if(this.age-s.age>0) return -1;
if(this.age-s.age<0) return 1;
else return 0;
}
}
class Test{
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
Student s1 = new Student(14,"lisi");
Student s2 = new Student(34,"zhangsan");
Student s3 = new Student(23,"wangwu");
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list);
for(Student s : list){
System.out.println(s);
}
}
}
Comparator只需要在Collections.sort()中传入比较器,不需要改变元素类,符合OOP思想。在这里我们利用了Lambda表达式。
public class Student {
public int age;
public String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
class Test{
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
Student s1 = new Student(14,"lisi");
Student s2 = new Student(34,"zhangsan");
Student s3 = new Student(23,"wangwu");
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list,(o1,o2)->{
if(o1.age-o2.age>0) return -1;
if(o1.age-o2.age<0) return 1;
else return 0;
});
for(Student s : list){
System.out.println(s);
}
}
}