《Comparable接口與Comparator接口的區別》


一、相同點:兩者均是java中的一個接口,都是對自定義的class比較大小的

二、區別:

1、Comparable(“可比較的”)
顧名思義,“可比較的”,使對象具有可比較的屬性。 定義在自定義類的內部,即讓自定義類實現這個Comparable接口,並覆蓋裏面的compareTo方法,使得這個類的所有對象(在你自定義的比較規則下)均具有可比較的屬性。排序使用時直接傳入自定義的類對象的序列即可。

2、Comparator(“比較器”)
顧名思義,“比較器”, 藉助一個比較器來實現對象之間的比較。定義在自定義類的外部,此時我們的自定義類不需做任何修改,我們只需另外自定義一個關於該自定義類的對象的比較器(只需實現Comparator接口即可定義一個自定義的比較器),並覆蓋裏面的compare方法。排序使用時不僅要傳入自定義的類對象的序列,還要額外傳入一個自定義的比較器實例。

三、舉例:

class Person
{
    int age;
    String name;
    public Person(int age, String name)
    {
        this.age = age;
        this.name = name;
    }
}

class Person implements Comparable
{
    
    public int compareTo(Person another)
    {
        int result = age - another.age;
        if(result == 0)
        {
            result = name.compareTo(another.name);
        }
        return result;
    }
}

class PersonComparator implements Comparator<Person>
{
    public int compare(Person a, Person b)
    {
        int result = a.age - b.age;
        if(result == 0)
        {
            result = one.name.compareTo(b.name);
        }
        return result;
    }
}

List<Person> personList = new List<Person>(){new Person(11, "Bob"),new Person(12,"Jenny")};

//使用Comparable
Collections.sort(personList);
//使用Comparator
Collections.sort(personList, new PersonComparator());


四、兩者孰優孰劣:

使用Comparable比較簡單,只要實現了Comparable接口的對象就具有可比較的屬性,但是需要修改類定義的源代碼。相反,雖然使用Comparator比較麻煩,但是它不需要修改類定義的源代碼,而是另外自定義一個比較器,當某個自定義的對象需要進行比較的時候,就把對象序列連同比較器實例一同傳入方法中,並且,在Comparator中我們可以實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,省時省力。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章