国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Comparable和Comparator的區別

2019-11-08 18:44:48
字體:
來源:轉載
供稿:網友

原文地址:http://www.cnblogs.com/szlbm/p/5504634.html

初次碰到這個問題是之前有一次電話面試,問了一個小時的問題,其中有一個問題就問到Comparable和Comparator的區別,當時沒答出 來。之后是公司入職時候做的一套java編程題,里面用JUnit跑用例的時候也用到了Comparator接口,再加上JDK的大量的類包括常見的 String、Byte、Char、Date等都實現了Comparable接口,因此要學習一下這兩個類的區別以及用法。

Comparable

Comparable可以認為是一個內比較器,實現了Comparable接口的類有一個特點,就是這些類是可以和自己比較的,至于具體和另一個實現了Comparable接口的類如何比較,則依賴compareTo方法的實現,compareTo方法也被稱為自然比較方法。如果開發者add進入一個Collection的對象想要Collections的sort方法幫你自動進行排序的話,那么這個對象必須實現Comparable接口。compareTo方法的返回值是int,有三種情況:

1、比較者大于被比較者(也就是compareTo方法里面的對象),那么返回正整數

2、比較者等于被比較者,那么返回0

3、比較者小于被比較者,那么返回負整數

寫個很簡單的例子:

public class Domain implements Comparable { PRivate String str;

public Domain(String str){ this.str = str;}public int compareTo(Domain domain){ if (this.str.compareTo(domain.str) > 0) return 1; else if (this.str.compareTo(domain.str) == 0) return 0; else return -1;}public String getStr(){ return str;}

}

public static void main(String[] args) { Domain d1 = new Domain(“c”); Domain d2 = new Domain(“c”); Domain d3 = new Domain(“b”); Domain d4 = new Domain(“d”); System.out.println(d1.compareTo(d2)); System.out.println(d1.compareTo(d3)); System.out.println(d1.compareTo(d4)); } 復制代碼 復制代碼 運行結果為:

0 1 -1 注意一下,前面說實現Comparable接口的類是可以支持和自己比較的,但是其實代碼里面Comparable的泛型未必就一定要是Domain,將泛型指定為String或者指定為其他任何任何類型都可以—-只要開發者指定了具體的比較算法就行。

Comparator

Comparator可以認為是是一個外比較器,個人認為有兩種情況可以使用實現Comparator接口的方式:

1、一個對象不支持自己和自己比較(沒有實現Comparable接口),但是又想對兩個對象進行比較

2、一個對象實現了Comparable接口,但是開發者認為compareTo方法中的比較方式并不是自己想要的那種比較方式

Comparator接口里面有一個compare方法,方法有兩個參數T o1和T o2,是泛型的表示方式,分別表示待比較的兩個對象,方法返回值和Comparable接口一樣是int,有三種情況:

1、o1大于o2,返回正整數

2、o1等于o2,返回0

3、o1小于o3,返回負整數

寫個很簡單的例子,上面代碼的Domain不變(假設這就是第2種場景,我對這個compareTo算法實現不滿意,要自己寫實現):

public class DomainComparator implements Comparator { public int compare(Domain domain1, Domain domain2) { if (domain1.getStr().compareTo(domain2.getStr()) > 0) return 1; else if (domain1.getStr().compareTo(domain2.getStr()) == 0) return 0; else return -1; } }

public static void main(String[] args) { Domain d1 = new Domain(“c”); Domain d2 = new Domain(“c”); Domain d3 = new Domain(“b”); Domain d4 = new Domain(“d”); DomainComparator dc = new DomainComparator(); System.out.println(dc.compare(d1, d2)); System.out.println(dc.compare(d1, d3)); System.out.println(dc.compare(d1, d4)); }

看一下運行結果:

0 1 -1 當然因為泛型指定死了,所以實現Comparator接口的實現類只能是兩個相同的對象(不能一個Domain、一個String)進行比較了,因此實現Comparator接口的實現類一般都會以”待比較的實體類+Comparator”來命名

總結

總結一下,兩種比較器Comparable和Comparator,后者相比前者有如下優點:

1、如果實現類沒有實現Comparable接口,又想對兩個類進行比較(或者實現類實現了Comparable接口,但是對compareTo方法內的比較算法不滿意),那么可以實現Comparator接口,自定義一個比較器,寫比較算法

2、實現Comparable接口的方式比實現Comparator接口的耦合性 要強一些,如果要修改比較算法,要修改Comparable接口的實現類,而實現Comparator的類是在外部進行比較的,不需要對實現類有任何修 改。從這個角度說,其實有些不太好,尤其在我們將實現類的.class文件打成一個.jar文件提供給開發者使用的時候。實際上實現Comparator 接口的方式后面會寫到就是一種典型的策略模式。

當然,這不是鼓勵用Comparator,意思是開發者還是要在具體場景下選擇最合適的那種比較器而已。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳原县| 金阳县| 慈溪市| 弋阳县| 当阳市| 增城市| 嘉禾县| 房山区| 藁城市| 安多县| 河南省| 武强县| 宿松县| 汾阳市| 延津县| 厦门市| 咸丰县| 米林县| 肃宁县| 南溪县| 津市市| 宣城市| 城市| 盐源县| 芮城县| 平凉市| 明星| 抚松县| 博罗县| 陈巴尔虎旗| 南投县| 南漳县| 皋兰县| 灵山县| 拉萨市| 武功县| 乐陵市| 阿拉善左旗| 清水河县| 天等县| 阿拉善盟|