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