c語言安裝全域性訊息鉤子的原始碼
Comparable是java.lang包下面的介面,lang包下面可以看做是java的基礎語言介面。
實際上Comparable介面只定義了一個方法:
public int compareTo(T o);
實現這個介面的類都需要實現compareTo方法,表示兩個類之間的比較。
這個比較排序之後的order,按照java的說法叫做natural ordering。這個order用在一些可排序的集合比如:SortedSet,SortedMap等等。
當使用這些可排序的集合新增相應的物件時,就會呼叫compareTo方法來進行natural ordering的排序。
幾乎所有的數字型別物件:Integer, Long,Double等都實現了這個Comparable介面。
Comparator
Comparator是一個FunctionalInterface,需要實現compare方法:
int compare(T o1, T o2);
Comparator在java.util包中,代表其是一個工具類,用來輔助排序的。
在講Comparable的時候,我們提到Comparable指定了物件的natural ordering,如果我們在新增到可排序集合類的時候想按照我們自定義的方式進行排序,這個時候就需要使用到Comparator了。
Collections.sort(List,Comparator),Arrays.sort(Object[],Comparator) 等這些輔助的方法類都可以通過傳入一個Comparator來自定義排序規則。
在排序過程中,首先會去檢查Comparator是否存在,如果不存在則會使用預設的natural ordering。
還有一個區別就是Comparator允許對null引數的比較,而Comparable是不允許的,否則會爬出NullPointerException。
舉個例子
最後,我們舉一個natural ordering和Comparator的例子:
@Test public void useCompare(){ List<Integer> list1 = Arrays.asList(5, 3, 2, 4, 1); Collections.sort(list1); log.info("{}",list1); List<Integer> list2 = Arrays.asList(5, 3, 2, 4, 1); Collections.sort(list2, (a, b) -> b - a); log.info("{}",list2); }
輸出結果:
[main] INFO com.flydean.CompareUsage - [1, 2, 3, 4, 5]
[main] INFO com.flydean.CompareUsage - [5, 4, 3, 2, 1]
預設情況下Integer是按照升序來排的,但是我們可以通過傳入一個Comparator來改變這個過程。