Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些 类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。

class Person implements Comparable<Person> {
  String firstName;
  String lastName;
  int birthdate;
  
  // Compare by firstName, break ties by lastName,
  // finally break ties by birthdate
  public int compareTo(Person other) {
    if (firstName.compareTo(other.firstName) != 0)
      return firstName.compareTo(other.firstName);
    else if (lastName.compareTo(other.lastName) != 0)
      return lastName.compareTo(other.lastName);
    else if (birthdate < other.birthdate)
      return -1;
    else if (birthdate > other.birthdate)
      return 1;
    else
      return 0;
  }
}

Comparator可以认为是是一个外比较器,有两种情况可以使用实现Comparator接口的方式:

  1. 一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较。
  2. 一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。

Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:

  1. o1大于o2,返回正整数
  2. o1等于o2,返回0
  3. o1小于o3,返回负整数
public class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person g1, Person g2) {
        return g1.getBirthdate() - g2.getBirthdate();
    }    
}