Comparable接口
Comparable是java.lang包下的一个接口,源码如下:只有一个方法compareTo,Comparable
/*
* @param <T> the type of objects that this object may be compared to
* @author Josh Bloch
* @see java.util.Comparator
* @since 1.2
*/
public interface Comparable<T> {
public int compareTo(T o);
}
根据源码上的说明:有以下要求
1)将其对象与指定的对象进行比较,返回一个负整数、零、正整数根据对象小于,等于或者大于指定的对象
2)具有对称性、传递性、自反性等
3) 强烈推荐但是不严格要求(x.cpmpareTo(y)==0)==(x.equals(y))
样例
//String类实现了Comparabel接口
List<String> strs = new ArrayList<>();
strs.add("123");
strs.add("234");
strs.add(0, "abc");
Collections.sort(strs);
System.out.println(strs);
//String类的定义如下:Comparable为泛型接口,继承时最好也指定其泛型类型
public final class String implements Serializable, Comparable<String>, CharSequence {
......
}
Comparator接口
在java.util包下,主要方法是
int compare(T o1, T o2);
Comparator可以认为是一个外比较器,两个比较对象只是是两个相同类型的对象。
比如我们在使用Collections.sort()或者Arrays.sort()方法时需要指定比较方法时可以通过如下面所示的方法进行设计 --重写compare方法
public static <T> void sort(T[] a, Comparator<? super T> c) {
...
...
}
或者
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
总结
总结一下,两种比较器Comparable和Comparator,后者相比前者有如下优点:
1、如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法
2、实现Comparable接口的方式比实现Comparator接口的耦合性 要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现Comparator 接口的方式后就是一种典型的策略模式。
样例
List<String> strs=new ArrayList<>();
strs.add("123");
strs.add("234");
strs.add(0,"abc");
Collections.sort(strs, new Comparator<String>() {//匿名内部类
@Override
public int compare(String str1, String str2) {
return str1.length()-str2.length();//指定比较长度
}
}
);
System.out.println(strs);