Java基礎之元素的比較
前言
在解讀TreeMap原始碼時,比較器是建構函式的一個引數,如果預設表示,採用預設比較器。本文筆者來聊聊元素的排序的兩個常用介面Comparable和Comparator。
Comparable
comparable介面是一個,內部比較器。由於-able是形容詞的字尾,因此,它是領域模型中簡單物件的特徵。因此也叫作內部比較器。如下程式碼所示,
1 public class BaseDomain implements Comparable { 2 3 @Override 4 public int compareTo(Object o) { 5 return0; 6 } 7 }
內部比較器,只要在我們的簡單domain物件中實現Comparable介面即可。同時我們的domain物件需要實現compateTo方法。如上所示。Comparable是一個泛型介面,一般情況下,以簡單物件作為泛型,如下所示,
1 public class BaseDomain implements Comparable<BaseDomain> { 2 3 @Override 4 public int compareTo(BaseDomain o) { 5 return 0; 6 }7 }
指定泛型的好處是在compareTo時,不需要強制轉型。此處要注意的是,Comparable中的泛型不一定是類本身,也可以是其他的物件,比如String,Integer,Class,Annotation等。總之,除了基礎資料型別之外,其他型別都可以。只要在實際業務中,泛型的實際型別和比較的演算法能夠相適配就可以了。
然而這種內部比較器違背了六大設計原則中的開閉的原則,即已經交付的類中,我們不適合去修改,或者這個類甚至不是我們內部的類,而是其他系統的類,我們更加不能修改,因此。內部比較器顯得非常的被動,於是,出現了外部比較器。Comparator。
Comparator
Compatator是外部比較器,以-or結尾,這個比較器則是名詞,是第三方的比較器,作為平臺性質的參與者。程式碼如下所示,
1 public class BaseDomainComparator implements Comparator { 2 @Override 3 public int compare(Object o1, Object o2) { 4 5 6 return 0; 7 } 8 }
同樣,和Comparable介面一樣,也是一個泛型介面,因此我們制定泛型為BaseDomain。
1 public class BaseDomainComparator implements Comparator<BaseDomain> { 2 @Override 3 public int compare(BaseDomain o1, BaseDomain o2) { 4 5 6 return 0; 7 } 8 }
一般的,如果o1大於02返回正數,如果01小於02返回負數,如果相等,返回0。這個比較器,不是簡單物件獨有的,因此如果需要比較,需要擁有兩個或兩個以上的物件,而且,這些物件的型別比較要一直。因此這個比較器的命名往往是 簡單物件+Comparator來命名。在Java原始碼中,最常見的就是Arrays.sort中作為比較器引數進行排序。而在TreeMap原始碼中的私有成員屬性也定義了一個比較器private final Comparator<? super K> comparator;因此,comparator比較器,是一個鬆耦合的比較器。