Java 中的排序如何参考 Comparable 和 Comparator?

How does sorting works in Java with reference to Comparable and Comparator?

我有一个 class 员工实现了 Comparable 接口

public class Employee implements Comparable<Employee> {

        private int id;
        private String name;
        private int age;
        private long salary;

        public Employee(int id, String name, int age, int salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
        }

        @Override
        public int compareTo(Employee emp) {
        return (this.id - emp.id);
        }

        @Override
        public String toString() {
        return "[id=" + this.id + ", name=" + this.name + ", age=" + this.age + ", salary=" +
            this.salary + "]";
        }

}

我有一个 Employee[] 数组 我正在使用 Arrays.sort()

对数组进行排序
Employee[] empArr = new Employee[4];
empArr[0] = new Employee(10, "Mikey", 25, 10000);
empArr[1] = new Employee(20, "Arun", 29, 20000);
empArr[2] = new Employee(5, "Lisa", 35, 5000);
empArr[3] = new Employee(1, "Pankaj", 32, 50000);

Arrays.sort(empArr);

我的问题是排序在内部是如何工作的, 是不是像 emArr[0].compareTo(emArr[1]) 然后根据需要交换元素?

我想知道里面是怎么进行比较和交换的? Comparatable's compareTo(Object o)Comparator's compare(o1,o2) 扮演什么角色?

Comparable 表示自然排序。一般来说 if A.compareTo(B) == 0 then A.equals(B) == true (这是一个并不总是遵循的通用约定)。

Comparator 当您想按非自然顺序排序时使用。例如,您想要对一个整数数组进行排序,以便所有偶数首先出现。

Arrays.sort() 正在使用合并排序。有关详细信息,请参阅 Arrays API。

已经有用于按顺序排列任何项目集合的排序技术。 Java 实用程序 class 像数组、集合一样使用这些技术。 要使任何此类排序技术发挥作用,重要的是要定义如何确定两个对象中哪个更大。

在对象的 class 实现 Comparable 接口的情况下,此信息在 compareTo() 的实现中提供。

此信息也可以在 Comparator class 的 compare() 方法的实现中提供。比较器 class 在您想根据要求定义不同的顺序时很有用(可能基于 运行 期间的某些参数)。实体的 class 可能实现 Comparable 接口,但我们希望在某些特定情况下排序具有不同的顺序或基于其他参数。

阅读更多关于 Comparable https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

Comparatorhttps://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html