Comparable和Comparator的區別

獨特潤許多人發表於2019-02-21

   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;
    }
}

相關文章