1> Comparable接口里面的方法是 int compareTo(T o);
Comparator接口里面的方法是 int compare(T o1,T o2);
2>一个类既可以实现Comparable接口也可以实现Comparator接口
如果希望一个类的比较方式有很多种,而且比较方式具有外部扩展性,那么可以实现Comparator接口,如果一个类默认的实现了Comparable接口,而你又希望再定义一个比较规则,那么你不可能去修改原类,因为这样会破坏封闭开放原则,最好的方法是写一个实现了Comparator接口的类。总的来说,Comparator接口比Comparable接口要灵活。
3>如果一个集合类中存放着一些对象,如果希望对这个集合进行排序,可以使用Collections类里面的sort方法。
sort方法有两种重载形式。
sort(Collection<T> c); 这种方法是根据类T里面默认的排序规则来排序的,即类T里面的compareTo方法
sort(Collection<T> c,Comparator<T> com);这种方法是根据类外面传进来的Comparator实现类类排序的。可以自己定义排序规则。
请参考下面的程序
package com.basic.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Comparable和Comparator的区别 {
public static void main(String[] args) {
//测试Comparable方法
List<Person> list = new ArrayList<Person>();
list.add(new Person(1006,"jason",59));
list.add(new Person(1020,"meihao",32));
list.add(new Person(1001,"xiaolei",20));
list.add(new Person(1012,"edision",16));
list.add(new Person(1002,"wangyong",29));
System.out.println("排序前:....");
printList(list);
//通过Collections.sort方法来对List进行排序,是按照List里面的对象(Person)
//实现的Comparable接口的规则来排序的
Collections.sort(list);
System.out.println("####################");
System.out.println("默认的Name排序规则,排序后:....");
printList(list);
//通过NumberComparator定义的规则排序
Collections.sort(list,new NumberComparator());
System.out.println("####################");
System.out.println("Number排序规则,排序后:....");
printList(list);
//通过NumberComparator定义的规则排序
Collections.sort(list,new AgeComparator());
System.out.println("####################");
System.out.println("Age排序规则,排序后:....");
printList(list);
}
private static void printList(List<Person> list){
for(Person p:list){
System.out.println(p);
}
}
}
class Person implements Comparable<Person> {
public String name;
public int age;
public int number;
public Person(){}
public Person(int num,String name,int age){
this.number = num;
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
return this.name.compareTo(o.name);
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", number=" + number
+ "]";
}
}
class NumberComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.number - o2.number;
}
}
class AgeComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
}