Java中比較器Comparator和Comparable的區(qū)別
一、背景
我們在使用 Collections.sort() 對鏈表進行排序(或者使用 Arrays.sort() 對數(shù)組進行排序)時,常常需要根據(jù)不同情況自定義排序規(guī)則。
比如:當我們存儲學生對象時,我們需要按照學生年齡進行排序,這時我們就可以通過比較器 Comparator 或者 Comparable 對排序順序進行控制。
本文將結合示例對 Comparator 和 Comparable 兩種比較器的使用進行介紹
二、Comparable
Comparable 是一個接口,其本質上是一個內比較器(在類內部)。
需要定義排序/比較規(guī)則的類實現(xiàn) Comparable 接口,并且重寫 compareTo(Object o) 方法,從而自定義比較規(guī)則。
public interface Comparable<T>
Comparable 代碼示例 :
下面的代碼為 Student 類重寫了 compareTo 方法,實現(xiàn)了 Student 對象按照 age 大小進行比較
public class Student implements Comparable<Object> {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "{" + this.getName() + "," + this.getAge() + "}";
}
// 通過重寫 compareTo 方法,實現(xiàn)比較器
@Override
public int compareTo(Object o) {
Student student = (Student) o;
return this.age - student.getAge();
}
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("wanqing", 21));
list.add(new Student("xinyu", 23));
list.add(new Student("huahua", 1));
Collections.sort(list);
System.out.println(list);
}
}可以觀察到輸出結果按照 age 升序進行了排序 ——

三、Comparator
Comparator 是一個外比較器,其使用場景為當一個類未實現(xiàn) Comparable 方法,或者實現(xiàn)的 Comparable 方法的比較規(guī)則不是我們現(xiàn)在想用的(比如我們想按照降序的方式排序),我們就可以通過為 sort() 方法傳入 Comparator 的形式,自定義排序規(guī)則。
其使用方式如下:
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
Comparator 重寫 compare 方法,方法內部重寫比較規(guī)則
Comparator 代碼示例
下面代碼通過傳入 Comparator比較器 的方式,實現(xiàn)了對 list 按照學生年齡降序排序
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("wanqing", 21));
list.add(new Student("xinyu", 23));
list.add(new Student("huahua", 1));
// 實現(xiàn)對 list 按照學生年齡降序排序
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 降序排序
return o2.getAge() - o1.getAge();
}
});
System.out.println(list);
}可以觀察到輸出結果按照 age 進行了降序排序 ——

到此這篇關于Java中比較器Comparator和Comparable的區(qū)別的文章就介紹到這了,更多相關Java的Comparator和Comparable內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Netty分布式pipeline管道Handler的添加代碼跟蹤解析
這篇文章主要介紹了Netty分布式pipeline管道Handler的添加代碼跟蹤解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
Java使用正則表達式截取重復出現(xiàn)的XML字符串功能示例
這篇文章主要介紹了Java使用正則表達式截取重復出現(xiàn)的XML字符串功能,涉及java針對xml字符串及指定格式字符串的正則匹配相關操作技巧,需要的朋友可以參考下2017-08-08
Java如何使用JSR303校驗數(shù)據(jù)與自定義校驗注解
這篇文章主要介紹了Java如何使用JSR303校驗數(shù)據(jù)與自定義校驗注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
J2EE Servlet基礎在瀏覽器上運行HelloServlet的方法
這篇文章主要介紹了J2EE Servlet基礎在瀏覽器上運行HelloServlet的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
java實現(xiàn)Object轉String的4種方法小結
這篇文章主要介紹了java實現(xiàn)Object轉String的4種方法小結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
SpringBoot集成內存數(shù)據(jù)庫Sqlite的實踐
sqlite這樣的內存數(shù)據(jù)庫,小巧可愛,做小型服務端演示程序,非常好用,本文主要介紹了SpringBoot集成Sqlite,具有一定的參考價值,感興趣的可以了解一下2021-09-09

