Comparable与Comparator都是Java提供的用来比较大小的接口,但Comparable是在类内定义比较方法,而Compator则是在类外定义比较方法。
Comparable接口位于java.lang包下:
public interface Comparable<T>{
public int compareTo(T o);//唯一一个方法
}
Comparator接口位于java.util包下:
public interface Comparator<T>{
int compare(T o1, T o2);
......//还有其他方法
}
自定义一个类分别演示下两个接口的用法:
实现Comparable接口:
public class Test {
public static void main(String[] args){
List<Person> list = new ArrayList<Person>();
list.add(new Person(20));
list.add(new Person(19));
list.add(new Person(21));
for(Person p : list)
System.out.println(p.getAge());
Collections.sort(list);
for(Person p : list)
System.out.println(p.getAge());
}
}
class Person implements Comparable<Person>{
private int age;
public Person(int age){
this.age = age;
}
public int compareTo(Person anotherPerson){
if(age == anotherPerson.age)
return 0;
else if(age < anotherPerson.age)
return -1;
else
return 1;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
实现Comparator接口:
public class Test {
public static void main(String[] args){
List<Person> list = new ArrayList<Person>();
list.add(new Person(20));
list.add(new Person(19));
list.add(new Person(21));
for(Person p : list)
System.out.println(p.getAge());
Collections.sort(list, new PersonComparator());
for(Person p : list)
System.out.println(p.getAge());
}
}
class Person{
private int age;
public Person(int age){
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class PersonComparator implements Comparator<Person>{
public int compare(Person p1, Person p2){
if(p1.getAge() == p2.getAge())
return 0;
else if(p1.getAge() < p2.getAge())
return -1;
else
return 1;
}
}
运行结果都为:
两者的选择:
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要在类内部进行方法的定义,如遇到复杂的比较逻辑,代码看起来会比较混乱冗余, 用Comparator 的好处是不需要将比较方法定义在类内,代码的分离性较好。