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

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

檢查Comparator接口的契約義務

2019-11-18 15:07:28
字體:
來源:轉載
供稿:網友

  java.util.Comparator接口輕易被實現并使用,但是在Comparator的API文檔里有些部分還是應當仔細閱讀一下的。

實現了Comparator接口的類可以傳給例如Collections.sort這樣的排序方法。它們也可以被Map或者Set類使用,用來保證Map或者Set里的元素始終是按某種順序排列的。TreeSet和TreeMap就是這樣的類。

在Comparator接口里,只有一個方法是需要實現的:

int compare(Object o1,Object o2);

假如o1小于o2,返回一個負數;假如o1大于o2,返回一個正數;假如他們相等,則返回0;

這些就是通常為了完成比較所要做的一切,但是在Comparator接口的契約里還有別的義務。

首先,compare方法一定要是對稱的,意思是compare(a,b)返回的結果要跟compare(b,a)相反。相反的結果意味著,要么返回的值帶有不同的正負號,要么都是0。注重,象compare(a,b)返回4而compare(b,a)返回-2這樣的情況是合法的。方法里經常可能拋出異常,在這個方法里拋出異常也要是對稱的。假如調用compare(a,b)時拋出了一個ClassCastException異常,那么調用compare(b,a)時也必須拋出一個ClassCastException異常。

考慮下面的代碼片斷:

public int compareTo(Object o1, Object o2) {
if(o1 instanceof Long) {
Long ln = (Long)o1;
return ln.compareTo(o2);
} else {
return 0;
}
}
假如a是new Long(5),b是”Text”,那么執行compare(o1,o2)將在java.lang.Long的compareTo方法里拋出一個ClassCastException,而執行compare(o2,o1)時將返回0(譯者注:原文這里是compare(o1,o2),根據上下文,應該是compare(o2,o1))。

其次,任何你預備重用的Comparator都必須是可序列化的。TreeSet和TreeMap類存儲Comparator以便進行比較,因此為了這兩個類能被序列化,它們使用的Comparator也必須能被序列化。

第三,假如進行比較操作時,有多種比較方法,那么Comparator應當實現equals方法。開發者創建有多種比較形式的Comparator是很常見的,例如:

import java.util.Comparator;

public class ExampleComparator {

PRivate int type;

public ExampleComparator(int i) {
this.type = i;
}

public int compareTo(Object o1, Object o2) {
if(type == 1) {
// one type of comparison
....
} else
if(type == 2) {
// another form of comparison
....
}
}

}
Comparator接口,通常被Collections.sort方法使用,它是JAVA中需要了解的一個很重要的部分,因為它有一些重要的契約義務,而它們經常被忽略了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沂源县| 阳西县| 揭西县| 长葛市| 宕昌县| 安康市| 泰来县| 泰州市| 中卫市| 西和县| 宣化县| 揭东县| 察雅县| 曲周县| 抚顺县| 兴安县| 白河县| 色达县| 高唐县| 乳源| 保德县| 乐平市| 六枝特区| 田东县| 盱眙县| 阳城县| 渝北区| 安福县| 沈阳市| 莎车县| 双桥区| 尼勒克县| 灵山县| 清远市| 屏山县| 广平县| 连平县| 乌鲁木齐县| 乌苏市| 汉寿县| 蓝田县|