淺談Comparable和Comparator

淺談Comparable和Comparator

Comparable和Comparator是Java對集合對象、數(shù)組對象的排序的兩種方式

Comparable

位于java.lang包下;是一個排序接口,自然排序,實現(xiàn)該接口的類,自動擁有排序的功能;該類的對象可以使用Collections.sort()和Arrays.sort()進行排序;

SortedMap 的key默認使用compareTo方法來進行鍵排序,SortedSet 默認使用compareTo方法進行元素的比較,也就說實現(xiàn)該接口的類對象,可以作為SortedMap的key和作為SortedSet的元素。

源碼解析

public interface Comparable<T> {
    public int compareTo(T o);
}

a.compareTo(b):返回正數(shù),說明a比b大

a.compareTo(b):返回負數(shù),說明a比b小

a.compareTo(b):返回0,說明a和b相等

Comparator

位于java.util包下;是一個外部比較器接口,自定義排序,該類的對象可以作為Collections.sort()和Arrays.sort()方法的參數(shù)進行自定義排序。

對于SortedMap和SortedSet來說,一般要保證compare方法和equals方法的結(jié)果保持一致。

對于序列化數(shù)據(jù)結(jié)構(gòu)的TreeMap和TreeSet來說,實現(xiàn)該接口的類也要實現(xiàn)Serializable接口保證序列化的能力。

源碼解析

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
    // ...
}

compare(a, b):返回正數(shù),說明a比b大

compare(a, b):返回負數(shù),說明a比b小

compare(a, b):返回0,說明a和b相等

代碼

Comparable

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student implements Serializable, Comparable<Student> {
    private String name;
    private Integer age;

    @Override
    public int compareTo(Student s) {

        if (age > s.getAge()) {
            return 1;
        } else if (age < s.getAge()) {
            return -1;
        } else {
            return 0;
        }
    }
}
@Test
public void test01() {

    List<Student> students = Arrays.asList(
            new Student("zhangsan", 15),
            new Student("lisis", 92),
            new Student("wangwu ", 19),
            new Student("zhaoliu", 18)
    );

    Collections.sort(students);

    students.stream().forEach(System.out::println);

}

輸出:

Student(name=zhangsan, age=15)
Student(name=lisis, age=18)
Student(name=wangwu , age=19)
Student(name=zhaoliu, age=92)

Comparator

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Teacher implements Serializable {

    private String name;
    private Integer age;

}
@Test
public void test02() {
    List<Teacher> teachers = Arrays.asList(
            new Teacher("zhangsan", 15),
            new Teacher("lisis", 92),
            new Teacher("wangwu ", 19),
            new Teacher("zhaoliu", 18)
    );

    Collections.sort(teachers, (a, b) -> {
        if (a.getAge() > b.getAge()) {
            return 1;
        } else if (a.getAge() < b.getAge()) {
            return -1;
        } else {
            return 0;
        }
    });

    teachers.stream().forEach(System.out::println);
  
}

輸出:

Teacher(name=zhangsan, age=15)
Teacher(name=lisis, age=18)
Teacher(name=wangwu , age=19)
Teacher(name=zhaoliu, age=92)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容