JavaSE--Comparator 和 Comparable 区别

public interface Comparable<T>

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器

public interface Comparator<T>

强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sortArrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

区别:简单的说就是 Comparable 的实现使得类可以排序,而 Comparator 的应用场景是需要排序的类本身并没有实现 Comparator 接口,这时候调用 Arrays 的 sort方法则需要传入一个比较器,一般传入一个匿名局部内部类。

1 package org.wzh.compare2;
2 
3 public interface Animal {
4     
5     int getAge();
6 
7 }
 1 package org.wzh.compare2;
 2 
 3 public class Cat implements Animal {
 4 
 5     private String name;
 6     private int age;
 7 
 8     public Cat() {
 9     }
10 
11     public Cat(String name, int age) {
12         super();
13         this.name = name;
14         this.age = age;
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     @Override
34     public String toString() {
35         return "Cat [name=" + name + ", age=" + age + "]";
36     }
37 
38 }
 1 package org.wzh.compare2;
 2 
 3 public class Dog implements Animal {
 4 
 5     private String name;
 6     private int age;
 7 
 8     public Dog() {
 9     }
10 
11     public Dog(String name, int age) {
12         super();
13         this.name = name;
14         this.age = age;
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     @Override
34     public String toString() {
35         return "Dog [name=" + name + ", age=" + age + "]";
36     }
37 
38 
39 }
package org.wzh.compare2;

import java.util.Arrays;
import java.util.Comparator;

public class TestCompare {
    
    public static void main(String[] args) {
        Dog dog = new Dog("Shrek", 17);
        Cat cat = new Cat("Tom", 12);
        Animal[] animals = new Animal[]{dog, cat};
        System.out.println(Arrays.toString(animals));
        Arrays.sort(animals, new Comparator<Animal>() {

            public int compare(Animal o1, Animal o2) {
                // TODO Auto-generated method stub
                return o1.getAge() - o2.getAge();
            }
        });
        System.out.println(Arrays.toString(animals));
    }

}

如果 Dog 和 Cat 类都实现了 Comparable 接口,直接使用 

static void sort(Object[] a)
          根据元素的自然顺序对指定对象数组按升序进行排序。

反之,秉着不修改已完成代码的情况下排序则使用

static
<T> void
sort(T[] a, Comparator<? super T> c)
          根据指定比较器产生的顺序对指定对象数组进行排序。
原文地址:https://www.cnblogs.com/microcat/p/6945259.html