Comparable
package java.lang;
public interface Comparable<T> {
public int compareTo(T o);
}
Comparator
package java.util;
public interface Comparator<T> {
//必须实现的方法
int compare(T o1, T o2);
//选择实现
boolean equals(Object obj);
}
为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。
相同点
- 两者都是用来用作对象之间的比较,都可以自定义比较规则;
- 两者都是返回一个描述对象之间关系的int;
区别:
- comparable 在java.lang包下,comparator在java.util包下;
- 实现comparable 必须重写compareTo(T o),实现comparator必须重写compare(T o1,T o2);
- comparable是内在比较器,表示这个类的对象直接可以相互比较this.compareTo(this),该类支持排序,这个类对象组成的集合就可以直接使用Collections.sort方法排序,此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。comparator是外在比较器,如果想比较两个类又没有实现comparable或者想实现比较排序的,可以用Comparator.compara(o1,o2);
- comparator 是典型的策略模式(策略模式指定义一组算法类,将每个算法实现封装起来,让他们可以相互替换,不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。)每个类都可以实现comparator,都可以实现比较排序;
- Comparator与Comparable同时存在的情况下,比较器Comparator优先级高。
- 使用Comparable需要修改原先的实体类,是属于一种自然排序,而Comparator 是不用修改原先的类的实现一个新的比较器 。Comparator实际应用广,