面试题 - Java Comparable和Comparator 区别

Comparable

package java.lang;
public interface Comparable {
    public int compareTo(T o);
}

Comparator

package java.util;
public interface Comparator {
    //必须实现的方法
    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)函数;所以,其它所有的类也相当于都实现了该函数。

相同点

  1. 两者都是用来用作对象之间的比较,都可以自定义比较规则;
  2. 两者都是返回一个描述对象之间关系的int;

区别:

  1. comparable 在java.lang包下,comparator在java.util包下;
  2. 实现comparable 必须重写compareTo(T o),实现comparator必须重写compare(T o1,T o2);
  3. comparable是内在比较器,表示这个类的对象直接可以相互比较this.compareTo(this),该类支持排序,这个类对象组成的集合就可以直接使用Collections.sort方法排序,此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。comparator是外在比较器,如果想比较两个类又没有实现comparable或者想实现比较排序的,可以用Comparator.compara(o1,o2);
  4. comparator 是典型的策略模式(策略模式指定义一组算法类,将每个算法实现封装起来,让他们可以相互替换,不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。)每个类都可以实现comparator,都可以实现比较排序;
  5. Comparator与Comparable同时存在的情况下,比较器Comparator优先级高。
  6. 使用Comparable需要修改原先的实体类,是属于一种自然排序,而Comparator 是不用修改原先的类的实现一个新的比较器 。Comparator实际应用广,

你可能感兴趣的:(java,面试题)