参考链接:https://www.cnblogs.com/skywang12345/p/3324788.html

Comparable介绍

Comparable位于java.lang包下,含义为可比较的,故当要求一个类具备比较功能时,要实现Comparable接口。
Comparable接口源码如下:

package java.lang;
import java.util.*;

public interface Comparable<T> {
     public int compareTo(T o);
}

当类实现这个接口时,需要实现compareTo方法。
实现原则:假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。(JDK的sort函数如Arrays.sort是按这个原则来判断两个对象之间的大小的,具体的内部实现由我们自己定义。我们甚至可以采用相反的方式来定义,从例如sort排序默认是升序,如果我们内部采用相反的排序规则,x大于y返回-1,x小于y返回1,这样就可以实现降序)

Comparator介绍

Comparator是一个比较器接口,当我们需要对一系列对象进行排序时,可以通过实现Comparator接口,来实现自定义排序方式。
Comparator接口源码如下:

package java.util;

public interface Comparator<T> {

    int compare(T o1, T o2);

    ...//other methods
}

实现原则:int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

两者比较

通过一个例子来说明Comparable的作用:

public class CompareDemo {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person(1,"xiaoma"));
        list.add(new Person(2,"xiaoli"));
        Collections.sort(list);
    }
}
//如果不实现Comparable接口,前面的Collections.sort将会报错。
class Person implements Comparable<Person> {
    int age;
    String name;
    Person(int age,String name){
        this.age=age;
        this.name=name;
    }
    @Override
    public int compareTo(Person o) {
        if(age>o.age){
            return 1;
        }else if(age==o.age){
            return 0;
        }else return -1;
    }
}

在上面例子的基础上,我们定义自己的比较器,如下:

public class CompareDemo {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person(1,"xiaoma"));
        list.add(new Person(2,"xiaoli"));
        //此处添加一个比较器
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o2.age-o1.age;
            }
        });
    }
}
class Person implements Comparable<Person> {
    int age;
    String name;
    Person(int age,String name){
        this.age=age;
        this.name=name;
    }

    @Override
    public int compareTo(Person o) {
        if(age>o.age){
            return 1;
        }else if(age==o.age){
            return 0;
        }else return -1;
    }
}

通过上面的例子,我们可以简单理解,Comparable类比内部比较器,Comparator类似一个外部比较器。