Comparable接口和Comparator接口的做用 : 用於給實現類規範比較(排序)的方法.java
首先看兩個接口的代碼:ide
Comparable接口函數
public interface Comparable<T> { public int compareTo(T o); }
Comparator接口this
@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); //其餘默認方法和靜態方法; //...... }
比較兩個接口的代碼,咱們能夠看到:spa
1.Comparable的compareTo(T)方法只有1個參數,.code
2.Comparator接口的compare(T o1, T o2)方法有兩個參數, 有@FunctionalInterface接口,因此有Lambda表達式的用法對象
因此,blog
Comparable只能在類內部實現比較功能,讓想讓實現比較功能的類自身實現Comparable接口排序
Comparator能夠作成比較器類,讓比較器類實現Comparator接口繼承
Comparator接口爲何有多個抽象方法還被標註爲函數式接口?
compare(T o1, T o2)方法外的另外一個抽象方法equals(Object obj)是Object類的方法,所以全部類都有該方法,不影響Comparator做爲函數式接口(瞎猜的).
*接口並不是繼承自Object,只是接口定義了一套與Object徹底相同的方法(詳細內容能夠網上查詢一下,這裏暫不討論)
讓該類實現Comparable接口,並重寫接口內的compareTo(T o)方法,示例以下
public Person implaments Comparable{ private int id; private String name; //......構造函數及get/set方法省略 @Override public int compareTo(Person p) { int result = this.id-p.getId(); if(result<0) return -1; if(result > 0) return 1; return 0; } }
這樣,該Person類就具有了比較的功能,當要給ArrayList<Person> list排序的時候,就能夠調用Collections.sort(List T)方法,來實現對集合list的排序.
答案是: 使用比較器(Comparator)
有兩種使用方法:
Collections.sort(list1, new Comparator<String>() { @Override public int compare(String o1, String o2) { int a = Integer.parseInt(o1); int b = Integer.parseInt(o2); if (a>b) return 1; if (a<b) return -1; return 0; } });
list1.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { int a = Integer.parseInt(o1); int b = Integer.parseInt(o2); if (a>b) return 1; if (a<b) return -1; return 0; } )
由於Comparator接口是函數式接口,因此List的sort()方法和Collections的sort()方法,均可以用Lambda表達式的寫法.
Collections.sort(list1, (a,b) -> { //......省略 return 0; }); list1.sort((a, b) -> { //......省略 return 0; });
fff