一、背景
我们在使用 Collections.sort() 对链表进行排序(或者使用 Arrays.sort() 对数组进行排序)时,常常需要根据不同情况自定义排序规则。比如:当我们存储学生对象时,我们需要按照学生年龄进行排序,这时我们就可以通过比较器 Comparator 或者 Comparable 对排序顺序进行控制。
本文将结合示例对 Comparator 和 Comparable 两种比较器的使用进行介绍 ——
二、Comparable
Comparable 是一个接口,其本质上是一个内比较器(在类内部)。需要定义排序/比较规则的类实现 Comparable 接口,并且重写 compareTo(Object o) 方法,从而自定义比较规则。
public interface Comparable<T>
Comparable 代码示例 :
下面的代码为 Student 类重写了 compareTo 方法,实现了 Student 对象按照 age 大小进行比较
public class Student implements Comparable<Object> {
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "{" + this.getName() + "," + this.getAge() + "}";
    }
    
    // 通过重写 compareTo 方法,实现比较器
    @Override
    public int compareTo(Object o) {
        Student student = (Student) o;
        return this.age - student.getAge();
    }
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("wanqing", 21));
        list.add(new Student("xinyu", 23));
        list.add(new Student("huahua", 1));
        Collections.sort(list);
        System.out.println(list);
    }
}
可以观察到输出结果按照 age 升序进行了排序 ——

三、Comparator
Comparator 是一个外比较器,其使用场景为 ——
 当一个类未实现 Comparable 方法,或者实现的 Comparable 方法的比较规则不是我们现在想用的(比如我们想按照降序的方式排序),我们就可以通过为 sort() 方法传入 Comparator 的形式,自定义排序规则。
其使用方式如下:
Collections.sort(List<T> list, Comparator<? super T> c);
Arrays.sort(T[] a, Comparator<? super T> c);
Comparator 重写 compare 方法,方法内部重写比较规则
Comparator 代码示例
下面代码通过传入 Comparator比较器 的方式,实现了对 list 按照学生年龄降序排序
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("wanqing", 21));
        list.add(new Student("xinyu", 23));
        list.add(new Student("huahua", 1));
        // 实现对 list 按照学生年龄降序排序
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 降序排序
                return o2.getAge() - o1.getAge();
            }
        });
        System.out.println(list);
    }
可以观察到输出结果按照 age 进行了降序排序 ——


















![[ESP][驱动]ST7701S RGB屏幕驱动](https://img-blog.csdnimg.cn/img_convert/55bd19e9ebc2f9ab367664848db56b8d.png)

