Comparable和Comparator接口的比较
Comparator位于包java.util,而Comparable位于包java.lang。
interface Comparable<T> {
int compareTo(T o);
}
interface Comparator<T> {
int compare(T o1, T o2);
}
Integer,String等这些基本类型的Java封装类都已经实现了Comparable接口,这些类对象本身就支持自比较,直接调用Collections.sort()就可以
对集合中元素的排序,无需自己实现Comparable接口。
有些自定义类的List序列,档这个对象不支持自比较或自比较函数不能满足你的要求,可以写一个比较器来完成两个对象大小的比较,
也就是指定使用Comparator。
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以是自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现。
Comparator接口是一个外比较器,有两种情况可以使用Comparator接口
(1)一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
(2)一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。
一个类实现Comparable接口,表明这个类的对象之间是可以互相比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator可以在下面2种环境使用:
(1)类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身。
(2)可以使用多种排序标准,比如升序,降序等。
总结:
两种比较器Comparable和Comparator,后者相比前者有如下优点:
1. 如果实现类没有实现Comparable接口,又想对两个类进行比较,那么可以实现Comparator接口,自定义一个比较器,写比较算法。
2. 实现Comparable接口的方式比实现Comparator的耦合性要强一点。如果要修改比较算法,则需要修改Comparable接口的实现类。
而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改。