JAVA有两种比较器,分别是:Comparator 和 Comparable
我看网上说Comporable是内部比较器,而Comparator是外部比较器,由于这两个都是接口,所以都需要去实现,而实现Comporable接口则需要实现compareTo方法,实现Comparator需要实现compare方法。Comparable接口一般由要比较的类实现,所以叫内部比较器,而comparator比较器一般是单独实现,或者匿名内部类实现。
例如:
public class Person implements Comparable {
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 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 + " ");
}
}
}
运行结果:
排序前:
12 9 10 22
排序后:
9 10 12 22
自定义比较器:
public class myComparator implements Comparator {
@Override
public int compare(Person p1, Person p2) {
// TODO Auto-generated method stub
return p2.age - p1.age;
}
}
然后在比较的时候把它给传过去:
//接上面的测试方法
System.out.println(“\n” + “使用自定义比较器排序后:”);
Collections.sort(list, new myComparator());
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).age + " ");
}
运行结果如下:
排序前:
12 9 10 22
排序后:
9 10 12 22
使用自定义比较器排序后:
22 12 10 9
综上,两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动