JAVA有兩種比較器恤批,分別是:Comparator 和 Comparable
我看網(wǎng)上說Comporable是內(nèi)部比較器欧啤,而Comparator是外部比較器霹菊,由于這兩個(gè)都是接口状婶,所以都需要去實(shí)現(xiàn)鸭巴,而實(shí)現(xiàn)Comporable接口則需要實(shí)現(xiàn)compareTo方法,實(shí)現(xiàn)Comparator需要實(shí)現(xiàn)compare方法巡通。Comparable接口一般由要比較的類實(shí)現(xiàn)尘执,所以叫內(nèi)部比較器,而comparator比較器一般是單獨(dú)實(shí)現(xiàn)扁达,或者匿名內(nèi)部類實(shí)現(xiàn)正卧。
例如:
public class Person implements Comparable<Person> {
int age;
public Person(int age) {
this.age = age;
}
@Override
public int compareTo(Person person) {
// TODO Auto-generated method stub
return this.age - person.age;
}
}
測試代碼:
public class TestComparator {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person(12));
list.add(new Person(9));
list.add(new Person(10));
list.add(new Person(22));
System.out.println("排序前:");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).age + "? ");
}
System.out.println("排序后:");
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).age + "? ");
}
}
}
運(yùn)行結(jié)果:
排序前:
12? 9? 10? 22?
排序后:
9? 10? 12? 22?
自定義比較器:
public class myComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
// TODO Auto-generated method stub
return p2.age - p1.age;
}
}
然后在比較的時(shí)候把它給傳過去:
//接上面的測試方法
System.out.println("\n" + "使用自定義比較器排序后:");
Collections.sort(list, new myComparator());
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).age + "? ");
}
運(yùn)行結(jié)果如下:
排序前:
12? 9? 10? 22?
排序后:
9? 10? 12? 22?
使用自定義比較器排序后:
22? 12? 10? 9?
綜上,兩者的區(qū)別是實(shí)現(xiàn)Comparator接口代碼更加靈活跪解,可以定義某個(gè)類的多個(gè)比較器炉旷,從而在排序時(shí)根據(jù)實(shí)際場景自由調(diào)用,而Comparable接口實(shí)現(xiàn)后便不能改動(dòng)