一、相同點:兩者均是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中我們可以實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,省時省力。