一、Comparable:是一个排序接口。
    里面有一个compareTo(T o)方法 若一个类实现了Comparable接口中的compareTo(T o);方法,就意味着该类支持排序。实现了Comparable接口的类的对象的容器或数组可以通过Collections.sort或Arrays.sort进行自动排序。
    Comparable原码:

    1. public interface Comparable<T> {
    2. public int compareTo(T o);
    3. }
    1. 此接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。<br /> 现在我们有一个person类实现Comparable接口
    1. public class Person implements Comparable<Person>{
    2. String name;
    3. int age;
    4. public Person(String name, int age)
    5. {
    6. this.name = name;
    7. this.age = age;
    8. }
    9. public String getName()
    10. {
    11. return name;
    12. }
    13. public int getAge()
    14. {
    15. return age;
    16. }
    17. @Override
    18. public String toString() {
    19. return "Person{" +
    20. "name='" + name + '\'' +
    21. ", age=" + age +
    22. '}';
    23. }
    24. @Override
    25. public int compareTo(Person o) {
    26. //o.age-age//从大到小排序
    27. return age-o.age;//从小到大排序
    28. }
    29. }
    1. 则我们在集合或数组中对person对象进行排序
    1. public class PersonDemo {
    2. public static void main(String[] args) {
    3. //集合的使用
    4. List<Person> arrayList = new ArrayList<>();
    5. Person p1=new Person("cccc",18);
    6. Person p2=new Person("dddd",14);
    7. arrayList.addAll(Arrays.asList(p1,p2));
    8. System.out.println("对集合排序前:"+arrayList);
    9. //对集合排序
    10. Collections.sort(arrayList);
    11. System.out.println("对集合排序后:"+arrayList);
    12. //数组的使用
    13. System.out.println("==================数组的使用===============");
    14. Person[]people={p1,p2};
    15. System.out.println("排序前:");
    16. for (Person person : people) {
    17. System.out.print(person);
    18. }
    19. System.out.println();
    20. Arrays.sort(people);
    21. System.out.println("排序后:");
    22. for (Person person : people) {
    23. System.out.print(person);
    24. }
    25. }
    26. }
    27. Output:
    28. 对集合排序前:[Person{name='cccc', age=18}, Person{name='dddd', age=14}]
    29. 对集合排序后:[Person{name='dddd', age=14}, Person{name='cccc', age=18}]
    30. ==================数组的使用===============
    31. 排序前:
    32. Person{name='cccc', age=18}Person{name='dddd', age=14}
    33. 排序后:
    34. Person{name='dddd', age=14}Person{name='cccc', age=18}
    35. Process finished with exit code 0

    二、Comparator:
     Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。该接口定义如下:

    1. package java.util;
    2. public interface Comparator<T>
    3. {
    4. int compare(T o1, T o2);
    5. boolean equals(Object obj);
    6. }

    注意:
    1、若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
       2、int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
    如果上面列子中Person没有实现comparable接口,那此时我们可以去新建一个类型让其实现comparator接口,从而自己创建一个“比较器”。

    1. import java.util.Comparator;
    2. public class PersonCompartor implements Comparator<Person> {
    3. @Override
    4. public int compare(Person o1, Person o2) {
    5. return o1.age-o2.age;//从小到大排序
    6. //o2.age-o1.age//从大到小排序
    7. }
    8. }


    1. package com.Comparator;
    2. import java.util.ArrayList;
    3. import java.util.Arrays;
    4. import java.util.Collections;
    5. import java.util.List;
    6. public class PersonDemo {
    7. public static void main(String[] args) {
    8. List<Person> arrayList = new ArrayList<>();
    9. Person p1=new Person("cccc",18);
    10. Person p2=new Person("dddd",14);
    11. arrayList.addAll(Arrays.asList(p1,p2));
    12. Collections.sort(arrayList,new PersonCompartor());
    13. System.out.println(arrayList);
    14. System.out.println("==================数组的使用===============");
    15. Person[]people={p1,p2};
    16. System.out.println("排序前:");
    17. for (Person person : people) {
    18. System.out.print(person);
    19. }
    20. System.out.println();
    21. Arrays.sort(people,new PersonCompartor());
    22. System.out.println("排序后:");
    23. for (Person person : people) {
    24. System.out.print(person);
    25. }
    26. }
    27. }

    总结:
    如果需要对一个对象进行排序,这个对象是可以修改的,那么我们可以让这个对象之间去实现comparable接口。但如果该对象是不可变的,我们就需要去创建一个新类实现Comparator接口。让这个类充当比较器。来去比较目标对象。