Java中比較器Comparator和Comparable的區(qū)別
一、背景
我們?cè)谑褂?Collections.sort() 對(duì)鏈表進(jìn)行排序(或者使用 Arrays.sort() 對(duì)數(shù)組進(jìn)行排序)時(shí),常常需要根據(jù)不同情況自定義排序規(guī)則。
比如:當(dāng)我們存儲(chǔ)學(xué)生對(duì)象時(shí),我們需要按照學(xué)生年齡進(jìn)行排序,這時(shí)我們就可以通過比較器 Comparator 或者 Comparable 對(duì)排序順序進(jìn)行控制。
本文將結(jié)合示例對(duì) Comparator 和 Comparable 兩種比較器的使用進(jìn)行介紹
二、Comparable
Comparable 是一個(gè)接口,其本質(zhì)上是一個(gè)內(nèi)比較器(在類內(nèi)部)。
需要定義排序/比較規(guī)則的類實(shí)現(xiàn) Comparable 接口,并且重寫 compareTo(Object o) 方法,從而自定義比較規(guī)則。
public interface Comparable<T>
Comparable 代碼示例 :
下面的代碼為 Student 類重寫了 compareTo 方法,實(shí)現(xiàn)了 Student 對(duì)象按照 age 大小進(jìn)行比較
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 方法,實(shí)現(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);
}
}可以觀察到輸出結(jié)果按照 age 升序進(jìn)行了排序 ——

三、Comparator
Comparator 是一個(gè)外比較器,其使用場(chǎng)景為當(dāng)一個(gè)類未實(shí)現(xiàn) Comparable 方法,或者實(shí)現(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 方法,方法內(nèi)部重寫比較規(guī)則
Comparator 代碼示例
下面代碼通過傳入 Comparator比較器 的方式,實(shí)現(xiàn)了對(duì) list 按照學(xué)生年齡降序排序
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));
// 實(shí)現(xiàn)對(duì) list 按照學(xué)生年齡降序排序
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 降序排序
return o2.getAge() - o1.getAge();
}
});
System.out.println(list);
}可以觀察到輸出結(jié)果按照 age 進(jìn)行了降序排序 ——

到此這篇關(guān)于Java中比較器Comparator和Comparable的區(qū)別的文章就介紹到這了,更多相關(guān)Java的Comparator和Comparable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合第三方技術(shù)的詳細(xì)步驟
這篇文章主要介紹了SpringBoot整合第三方技術(shù),包括整合Junit、整合Mybatis、整合Mybatis-plus、整合Druid,本文通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
spring boot starter actuator(健康監(jiān)控)配置和使用教程
這篇文章主要介紹了spring-boot-starter-actuator(健康監(jiān)控)配置和使用教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
Mockito+PowerMock+Junit單元測(cè)試用途解析
本文介紹單元測(cè)試在開發(fā)和DevOps中的規(guī)范要求,詳解Mockito和PowerMock的使用,包括解耦依賴、模擬行為、驗(yàn)證調(diào)用及參數(shù)匹配,同時(shí)說明SpringBoot測(cè)試注解(如@MockBean)的用法,并提及IDEA插件Squaretest的自動(dòng)化測(cè)試生成功能,感興趣的朋友一起看看吧2025-06-06
java8中的lambda表達(dá)式,看這篇絕對(duì)夠
這篇文章主要介紹了java8中的lambda表達(dá)式,看這篇絕對(duì)夠!具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
springboot接收json數(shù)據(jù)時(shí),接收到空值問題
這篇文章主要介紹了springboot接收json數(shù)據(jù)時(shí),接收到空值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot接口加密與解密的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot接口加密與解密的實(shí)現(xiàn)2023-10-10

