所属位置区别: Comparable接口位于java.lang包下,通常被称为内部比较器;
Comparator接口位于java.util包下, 通常被称为外部比较器;
1. Q: 嗯?什么是内部比较器?那外部比较器又是什么?
首先来看一下Collections.sort(List<T> list)接口,这是一个泛型方法,其中传入的排序list集合的类型就强调了必须是一个继承了Comparable接口的实现类.他会默认调用该实现类内部覆写的排序方法.因为它是在类的内部实现的,故称为内部比较器
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
而如果我们需要排序的实现类没有实现Comparable接口,难道就不能实现了吗?
当然不会!因为同样给我们实现了另外一个接口,相比于前者,你需要默认传入一个Comparator接口的接口类来实现排序算法.
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
接下来代码实现一个以上操作:
public class Emp implements Comparable<Emp>{
private int id;
private String name;
private Double salary;
@Override
public int compareTo(Emp o) {
// if(this.salary > o.salary)
// return 1;
// else if(this.salary < o.salary)
// return -1;
// return 0;
return this.salary.compareTo(o.salary);
}
public Emp() {
}
public Emp(int id, String name, Double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
'}';
}
public class ComparableOrComparator {
public static void main(String[] args) {
List<Emp> empList = new ArrayList<>();
empList.add(new Emp(1,"张三",2000.0));
empList.add(new Emp(2,"李四",3000.0));
empList.add(new Emp(3,"王武",1000.0));
System.out.println("======使用Comparable降序排列=======");
Collections.sort(empList);
empList.forEach(System.out::println);
System.out.println("======使用Comparator降序排列=======");
Collections.sort(empList, new Comparator<Emp>() {
@Override
public int compare(Emp o1, Emp o2) {
return o2.getSalary().compareTo(o1.getSalary());
}
});
empList.forEach(System.out::println);
}
}
结果如图:
综上得:
Comparable: 内部比较器,如果想要使用自身定义好的排序方式,可以直接使用 Collections.sort(list) 方法进行排序即可
Comparator: 外部比较器, 如果需要实现的类没有实现Comparable,也不需要紧张,可以传入匿名的实现接口去完成比较器功能哦! 无需改变类的结构,更加灵活!