Comparable:使用Comparable一般都是通过类去实现此接口的,在类的内部去实现这个方法,所以一般人也称作为内部比较器(相对于Comparator来说),有好多的java原生的类都是实现了这个接口,比如String,....。
public interface Comparable<T> {
//如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
public int compareTo(T o);
}
Comparator:使用Comparator一般都是写一个类去实现Comparator接口,让这个类作为专用的比较器,在需要比较器的地方当做参数传入进去,这样就可以使用比较器了。
public interface Comparator<T> {
//根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
int compare(T o1, T o2);
}
使用Comparable的时候只能是让这个类实现接口,使其具有比较的功能,因为其需要override的函数compareTo(Object o),只要一个参数,所以只能用作内部的比较器,而使用Comparator的则是专门的建一个类实现Comparator作为比较器去用,可以单独的拿出来,不用捆绑到类上,在实际工作中可能会出现比较大小写字母的时候按照字母的顺序部分大小写,但是在java中String已经实现了compareTo,而且分大小写,我们知道A,D,a,d是这样排序的,如果使用自带的则是A,D,a,d,但是要求我们的结果是A,a,D,d,这时候就应该重新排序了。
List<String> list=new ArrayList<String>();
list.add("A");
list.add("D");
list.add("a");
list.add("d");
list.add("C");
list.add("c");
System.out.println(list);
System.out.println("--------------------------------------------");
Collections.sort(list);
System.out.println(list);
System.out.println("---------------------------------------------");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1==null||o2==null)
return 0;
return o1.toUpperCase().compareTo(o2.toUpperCase());
}
});
System.out.println(list);