Comparable 和 Comparator 都是介面,均為比較器
Comparable相當於“內比較器”,而Comparator相當於“外比較器”
實現Comparable的類,該類就具有自身比較的功能;Comparator的實現,是一個外部比較工具器
注意Comparable 和 Comparator 同時實現時,則以Comparator為主
Comparable 介面
Comparable 被認為是內比較器,也是自然排序,實現該介面的類,會有自身比較的功能,則依賴compareTo方法的實現
CompareTo方法的返回值是int,有三種情況:
1、比較者大於被比較者,那麼返回正整數
2、比較者等於被比較者,那麼返回0
3、比較者小於被比較者,那麼返回負整數
// Comparable 介面的定義 public interface Comparable<T> { public int compareTo(T o); }
例子:String 本身就以實現Comparable ,所以可以呼叫它的compareTo方法進行比較
class Person implements Comparable{ // 其他屬性 @Override public int compareTo(Person p){ int temp = this.age - p.age; return temp == 0 ? this.name.compareTo(p.name) : temp; } }
Comparator介面
Comparator 被認為是外比較器,我們如果需要控制某個類的次序,而該類本身不支援排序(即沒有實現Comparable介面),那麼我們就可以建立一個“該類的比較器”來進行排序,這個“比較器”只需要實現Comparator介面覆蓋compare(T o1, T o2)方法,即可,然後通過這個比較器對類進行比較且排序
compare(T o1, T o2)方法,int返回值有三種情況:
1、o1大於o2,返回正整數
2、o1等於o2,返回0
3、o1小於o3,返回負整數
有兩種場景可以使用實現Comparator介面的方式:
1、一個物件不支援自己和自己比較(沒有實現Comparable介面),但是又想對兩個物件進行比較
2、一個物件實現了Comparable介面,但是開發者認為compareTo方法中的比較方式並不是如他所願
例子:
public class PersonComparator implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { int temp = p1.getName().compareTo(p2.getName); return temp == 0 ? p1.getAge() - p2.getAge() : temp; } }