1.个人理解

当相对引用类型的进行排序时,我们可以使用Collections.sort(List<T> list)或Collections.sort(List<T> list,
Comparator<? super T> c)和(Arrays.sort)对对象集进行排序,但在排序之前要制定排序的规则,这时
就需要使用Comparable与Comparator接口实现排序规则。

Comparable(自然排序):Comparable属于一个内部排序,一个对象想要拥有排序的功能,则需要实现Comparable
接口并重写compareTo方法(定义自己的排序规则);

Comparator(比较器):Comparator属于一个外部排序,一个对象并没有实现Comparable接口时还想实现排序时,
则可以使用Comparator接口重写compare方法定义排序规则进行实现。

2.案例

Comparable

  • 定义User类实现Comparable接口
public class User implements Comparable<User>{
   

    String name;
    int age;

    public User() {
   
    }

    public User(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 "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    /* 返回1(大于),-1(小于),0(等于) */
    @Override
    public int compareTo(User o) {
   
       if (this.age > o.getAge()){
   
           return 1;
       }

       if (this.age< o.getAge()){
   
           return -1;
       }
       return 0;
    }
}
  • 测试类
public class Demo01 {
   

    public static void main(String[] args) {
   
        User[] users = {
   new User("x",16),new User("a",5)};
        Arrays.sort(users);

        Arrays.stream(users).forEach(System.out::println);
    }
}
  • 结果
User{
   name='a', age=5}
User{
   name='x', age=16}

Comparator

  • 定义User类
public class User {
   

    String name;
    int age;

    public User() {
   
    }

    public User(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 "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

  • 测试类
public class Demo01 {
   

    public static void main(String[] args) {
   
        User[] users = {
   new User("x", 16), new User("a", 5)};
        Arrays.sort(users, new Comparator<User>() {
   
            @Override
            public int compare(User o1, User o2) {
   
                if (o1.getAge() > o2.getAge()) return 1;
                if (o1.getAge() < o2.getAge()) return -1;
                return 0;
            }
        });

        Arrays.stream(users).forEach(System.out::println);
    }
}
  • 结果
User{
   name='a', age=5}
User{
   name='x', age=16}

3.注意

当Comparable和Comparator同时存在时,Comparator的优先级更高