Comparator接口定义在java.util包下,包含了两个方法:compare()和equals()。

compare()方法的定义如下:

int compare(Object obj1, Object obj2)

obj1和obj2是需要被比较的两个对象,如果两个对象【相等】,则该方法返回0,如果obj1【大于】obj2,则返回一个正值,否则返回一个负值。通过重写该方法,可以自定义对象排序的方式,比如,想以相反的顺序排序,可以创建一个比较器来反转比较输出的结果。

equals()方法的定义如下:

boolean equals(Object obj)

如果obj和调用该方法的对象都是比较器对象并且使用相同的排序,则返回true,否则返回false。一般情况下不会重写该方法。


Comparable接口定义在java.lang包下,只包含一个compareTo()方法。实现此接口的对象可以通过Collections.sort()或者Arrays.sort()进行排序。

compareTo()方法定义如下:

public int compareTo(Object obj)

如果调用该方法的对象大于obj,则返回正值,等于则返回0,否则返回负值。



两者比较:

Comparator是一个专门的比较器,在用Collections类的sort方法进行排序时,如果不指定比较器,集合内部的对象必须要实现Comparable接口,就叫做按自然顺序进行排序。

Comparator是策略模式(strategy design pattern),即不改变对象自身,用一个策略对象(strategy object)来改变它的行为。


如果还是不太明白可以仔细阅读下面的例子

import java.util.*;
//该类实现了两种接口
class Dog implements Comparator<Dog>, Comparable<Dog> {
    //类里有两个成员变量
   private String name;
   private int age;
   Dog() {
   }

   Dog(String n, int a) {
      name = n;
      age = a;
   }

   public String getDogName() {
      return name;
   }

   public int getDogAge() {
      return age;
   }

   // Overriding the compareTo method
   //自然排序定义为比较name这个字符串
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);//这里使用了String类的compareTo方法
   }

   // Overriding the compare method to sort the age 
   //定义一个比较器来比较年龄.如果想让年龄逆序,则返回d1.age - d.age.
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;//返回年龄的差值,越大第一个对象d越靠后
   }
}

public class Example {

   public static void main(String args[]) {
      // Takes a list o Dog objects
      List<Dog> list = new ArrayList<Dog>();

      list.add(new Dog("Shaggy", 3));
      list.add(new Dog("Lacy", 2));
      list.add(new Dog("Roger", 10));
      list.add(new Dog("Tommy", 4));
      list.add(new Dog("Tammy", 1));
      //使用Comparable接口的compareTo方法自然排序,排序的是字符串
      Collections.sort(list);   // Sorts the array list

      for(Dog a: list)   // printing the sorted list of names
         System.out.print(a.getDogName() + ", ");

      // Sorts the array list using comparator
      //sort()的第二个形参是个带有比较器的对象,因此使用该对象中compare()方法
      Collections.sort(list, new Dog());
      System.out.println(" ");
      
      for(Dog a: list)   // printing the sorted list of ages
         System.out.print(a.getDogName() +"  : "+ a.getDogAge() + ", ");
   }
}

该例子的运行结果是:

Lacy, Roger, Shaggy, Tammy, Tommy,
Tammy  : 1, Lacy  : 2, Shaggy  : 3, Tommy  : 4, Roger  : 10,

可以看出compareTo()方法自然排序是对name进行字典顺序的排序,而比较器是对年龄进行从大到小的排序。


参考:

1.https://www.tutorialspoint.com/java/java_using_comparator.htm