Comparable接口和Comparator接口的比较
1.Comparable詳解
1.1Comparable概述
來自java.lang.Comparable。Comparable是 排序接口。若一個類實現了Comparable接口,就意味著該類支持排序。實現了Comparable接口的類的對象的列表或數組可以通過Collections.sort或Arrays.sort進行自動排序。
此外,實現此接口的對象可以用作有序映射中的鍵或有序集合中的集合,無需指定比較器。
此 接口只有一個方法compareTo,比較此對象與指定對象的順序,如果該對象小
于、等于或大于指定對象,則分別返回負整數、零或正整數。
對于String類實現了這個Comparable接口(Integer也實現這接口)進行升序排列,并完成了比較規則的定義,但是這樣就把這種規則寫死了,那比如我想要字符串按照第一個字符降序排列,那么這樣就要修改String的源代碼,修改源碼這件事這是不可能的了!,
例子:
但是如果是我們自定義的類,我們可以重寫comepareTo()方法,再利用工具類進行排序,這樣按照我們想要的方式進行排序:
package untl; import java.util.Arrays; public class MyComparable {public static void main(String[] args) {student stu[]={new student("張三",14),new student("李四",19),new student("王五",17)};Arrays.sort(stu);for (student s: stu) {System.out.println(s);}} } class student implements Comparable<student>{private String name;private int age;public student(String name,int age){this.age=age;this.name=name;}public int compareTo(student stu){if(stu.age<this.age)return 1;//意思是按照升序排列else if(stu.age>this.age)return -1;elsereturn 0;}// public int compareTo(student stu)// {// return this.age-stu.age;// }//上述兩個compareTo等效public String toString(){return "姓名"+this.name+" 年齡"+this.age;}} 運行結果: 姓名張三 年齡14 姓名王五 年齡17 姓名李四 年齡19這里博主講一下compareTo()返回值的意義:
JDK官方默認是升序
對于這段代碼
return this.age-stu.age;其實這段代碼等價于:
if (this.age-stu.age>0)return 1;else if(this.age-stu.age<0)return -1;elsereturn 0;那么如果你修改了代碼;
if (this.age-stu.age>0)return -1;else if(this.age-stu.age<0)return 1;elsereturn 0;就會把默認的升序排列變成降序排列
當然降序排列也可以這么寫
其實返回值1的意思是兩比較對象需要在最初的位置上交換位置,返回-1,0代表排序的時候兩比較對象最初位置不需要交換,什么意思:
package untl; import java.util.Arrays; public class MyComparable {public static void main(String[] args) {student stu[]={new student("張三",19),new student("李四",14),};for (student s: stu) {System.out.println(s);}Arrays.sort(stu);for (student s: stu) {System.out.println(s);}} } class student implements Comparable<student>{private String name;private int age;public student(String name,int age){this.age=age;this.name=name;}public int compareTo(student stu){if (this.age-stu.age>0)return 1;else if(this.age-stu.age<0)return -1;elsereturn 0;}public String toString(){return "姓名"+this.name+" 年齡"+this.age;}} 運行結果: 姓名張三 年齡19 姓名李四 年齡14 姓名李四 年齡14 姓名張三 年齡19張三的最初位置為0,李四為1,那么由于返回值為1,所以兩者交換位置,這就是實現排序的基礎,其實返回值1可以替換成一個大于的數就,-1同樣可以替換成小于0的數,,正負值只是代表兩數大小的判斷
總的來說:Comparable強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實現compareTo()一次,不能經常修改類的代碼實現自己想要的排序.,比如上述我們要按照降序排列的話就必須從新修改方法里邊的源碼
總之:
comparable是需要比較的對象來實現接口。這樣對象調用實現的方法來比較。對對象的耦合度高(需要改變對象的內部結構,破壞性大)
2.Comparator詳解
2.1Comparator簡介
強行對某個對象進行整體排序。可以將Comparator 傳遞給sort方法(如Collections.sort或 Arrays.sort),從而允許在排序順序上實現精確控制。還可以使用Comparator來控制某些數據結構(如有序set或有序映射)的順序,或者為那些沒有自然順序的對象collection提供排序。
我們如果需要控制某個類的次序,而該類本身不支持排
序(即沒有實現Comparable接口),那么我們就可以建立一個“該類的比較器”來進行排
序,這個“比較器”只需要實現Comparator接口即可。也就是說,我們可以通過實現
Comparator來新建一個比較器,然后通過這個比較器對類進行排序。
2.2Comparator注意點
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”。
例子:
同樣的compare里邊的實現依然可以換成return 1 ,return -1的形式;
**>注意Comparator接口不是排序接口,我們必須要在Arrays或者Collections傳遞兩個參數,第一個參數是集合或者數組,第二個參數則是比較器Comparator(定義比較規則)
Comparable接口和Comparator接口的比較
1.Comparable是排序接口,若一個類實現了Comparable接口,就意味著“該類支持
排序”。Comparator是比較器,我們若需要控制某個類的次序,可以建立一個“該類的
比較器”來進行排序。Comparable相當于“內部比較器”,而Comparator相當于“外部比
較器”。
2.用Comparable簡單, 只要實現Comparable 接口的對象直接就成為一個可以比較
的對象,但是需要修改源代碼。 用Comparator 的好處是不需要修改源代碼, 而是另
外實現一個比較器, 當某個自定義的對象需要作比較的時候,把比較器和對象一起傳
遞過去就可以比大小了, 并且在Comparator 里面用戶可以自己實現復雜的可以通用
的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重復勞動了。
3.comparable接口實際上是出自java.lan包,它有一個compareTo(Object obj)方法用來排序
comparator接口實際上是出自java.util 包,它有一個compare(Object obj1, Object obj2)方法用來排序
4.一般我們需要對一個集合使用自定義排序時,我們就要重寫compareTo方法或compare方法,當我們需要對某一個集合實現兩種排序方式,比如一個song對象中的歌名和歌手名分別采用一種排序方法的話,我們可以重寫compareTo方法和使用自制的Comparator方法或者以兩個Comparator來實現歌名排序和歌星名排序,第二種代表我們只能使用兩個參數版的Collections.sort().
總結
以上是生活随笔為你收集整理的Comparable接口和Comparator接口的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java枚举(深刻而不深沉平淡而不平庸)
- 下一篇: Collection和Collectio