淺析Java中comparator接口與Comparable接口的區(qū)別
Comparable 簡(jiǎn)介
Comparable 是排序接口。
若一個(gè)類實(shí)現(xiàn)了Comparable接口,就意味著“該類支持排序”。 即然實(shí)現(xiàn)Comparable接口的類支持排序,假設(shè)現(xiàn)在存在“實(shí)現(xiàn)Comparable接口的類的對(duì)象的List列表(或數(shù)組)”,則該List列表(或數(shù)組)可以通過 Collections.sort(或 Arrays.sort)進(jìn)行排序。
此外,“實(shí)現(xiàn)Comparable接口的類的對(duì)象”可以用作“有序映射(如TreeMap)”中的鍵或“有序集合(TreeSet)”中的元素,而不需要指定比較器。
1. Comparator 和 Comparable 相同的地方
他們都是java的一個(gè)接口, 并且是用來(lái)對(duì)自定義的class比較大小的,
什么是自定義class: 如 public class Person{ String name; int age }.
當(dāng)我們有這么一個(gè)personList,里面包含了person1, person2, persion3....., 我們用Collections.sort( personList ),
是得不到預(yù)期的結(jié)果的. 這時(shí)肯定有人要問, 那為什么可以排序一個(gè)字符串list呢:
如 StringList{"hello1" , "hello3" , "hello2"}, Collections.sort( stringList ) 能夠得到正確的排序, 那是因?yàn)?
String 這個(gè)對(duì)象已經(jīng)幫我們實(shí)現(xiàn)了 Comparable接口 , 所以我們的 Person 如果想排序, 也要實(shí)現(xiàn)一個(gè)比較器。
2. Comparator 和 Comparable 的區(qū)別
Comparable
Comparable 定義在 Person類的內(nèi)部:
public class Persion implements Comparable {..比較Person的大小..},
因?yàn)橐呀?jīng)實(shí)現(xiàn)了比較器,那么我們的Person現(xiàn)在是一個(gè)可以比較大小的對(duì)象了,它的比較功能和String完全一樣,可以隨時(shí)隨地的拿來(lái)
比較大小,因?yàn)镻erson現(xiàn)在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結(jié)果。
Comparator
Comparator 是定義在Person的外部的, 此時(shí)我們的Person類的結(jié)構(gòu)不需要有任何變化,如
public class Person{ String name; int age },
然后我們另外定義一個(gè)比較器:
public PersonComparator implements Comparator() {..比較Person的大小..},
在PersonComparator里面實(shí)現(xiàn)了怎么比較兩個(gè)Person的大小. 所以,用這種方法,當(dāng)我們要對(duì)一個(gè) personList進(jìn)行排序的時(shí)候,
我們除了了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因?yàn)樵趺幢容^Person的大小是在PersonComparator
里面實(shí)現(xiàn)的, 如:
Collections.sort( personList , new PersonComparator() ).
3. Comparator 和 Comparable 的實(shí)例
Comparable:
實(shí)現(xiàn)Comparable接口要覆蓋compareTo方法, 在compareTo方法里面實(shí)現(xiàn)比較:
public class Person implements Comparable {
String name;
int age;
public int compareTo(Person another) {
int i = 0;
i = name.compareTo(another.name); // 使用字符串的比較
if(i == 0) { // 如果名字一樣,比較年齡, 返回比較年齡結(jié)果
return age - another.age;
} else {
return i; // 名字不一樣, 返回比較名字的結(jié)果.
}
}
}
這時(shí)我們可以直接用 Collections.sort( personList ) 對(duì)其排序了.
Comparator:
實(shí)現(xiàn)Comparator需要覆蓋 compare 方法:
public class Person{
String name;
int age;
}
class PersonComparator implements Comparator<Person> {
public int compare(Person one, Person another) {
int i = 0;
i = one.name.compareTo(another.name); // 使用字符串的比較
if(i == 0) { // 如果名字一樣,比較年齡,返回比較年齡結(jié)果
return one.age - another.age;
} else {
return i; // 名字不一樣, 返回比較名字的結(jié)果.
}
}
}
Collections.sort( personList , new PersonComparator()) 可以對(duì)其排序
4:總結(jié)
兩種方法各有優(yōu)劣, 用Comparable 簡(jiǎn)單, 只要實(shí)現(xiàn)Comparable 接口的對(duì)象直接就成為一個(gè)可以比較的對(duì)象,
但是需要修改源代碼, 用Comparator 的好處是不需要修改源代碼, 而是另外實(shí)現(xiàn)一個(gè)比較器, 當(dāng)某個(gè)自定義
的對(duì)象需要作比較的時(shí)候,把比較器和對(duì)象一起傳遞過去就可以比大小了, 并且在Comparator 里面用戶可以自
己實(shí)現(xiàn)復(fù)雜的可以通用的邏輯,使其可以匹配一些比較簡(jiǎn)單的對(duì)象,那樣就可以節(jié)省很多重復(fù)勞動(dòng)了。
相關(guān)文章
springboot集成測(cè)試最小化依賴實(shí)踐示例
這篇文章主要為大家介紹了springboot集成測(cè)試最小化依賴實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
springboot如何通過SSH連接遠(yuǎn)程服務(wù)器
這篇文章主要介紹了springboot如何通過SSH連接遠(yuǎn)程服務(wù)器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Kafka消費(fèi)客戶端協(xié)調(diào)器GroupCoordinator詳解
這篇文章主要為大家介紹了Kafka消費(fèi)客戶端協(xié)調(diào)器GroupCoordinator使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
SpringBoot集成Redisson實(shí)現(xiàn)延遲隊(duì)列的場(chǎng)景分析
這篇文章主要介紹了SpringBoot集成Redisson實(shí)現(xiàn)延遲隊(duì)列,本文通過場(chǎng)景分析實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Spring Boot實(shí)現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了Spring Boot實(shí)現(xiàn)郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
SpringBoot整合高德地圖實(shí)現(xiàn)天氣預(yù)報(bào)功能
在當(dāng)今數(shù)字化時(shí)代,天氣預(yù)報(bào)功能在眾多應(yīng)用中扮演著重要角色,通過整合高德地圖提供的天氣API,我們可以輕松地在自己的SpringBoot項(xiàng)目中實(shí)現(xiàn)這一功能,本文將詳細(xì)介紹如何在SpringBoot項(xiàng)目中整合高德地圖的天氣預(yù)報(bào)功能,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-03-03
SpringBoot如何使用@Value取配置文件中的map配置
這篇文章主要介紹了SpringBoot如何使用@Value取配置文件中的map配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

