深入分析Comparable与Comparator的区别

Comparable源码:

public interface Comparable<T> {   
    public int compareTo(T o);
}

Comparator源码:

@FunctionalInterface
public interface Comparator<T> {    
    int compare(T o1, T o2);   
    boolean equals(Object obj);   
}

这两个接口都实现了两个对象的比较,那么为什么需要实现两个不同的接口来实现一个相同的功能呢?存在即合理,故而肯定存在需要他们两个并行存在的必要原因。从源码层次进行分析:
其中Comparable只有一个compareTo(T o)需要实现,并且该方法只有一个参数,而比较最起码是需要两个参数,所以可以得知:该方法是被比较类的成员方法(类方法),故而该类需要实现Comparable接口。
Comparator在源码中包含很多方法其中需要实现的只有上述两个方法,并且对于equals方法所有类的父类——Object类中已经实现了(准确的说是native实现)所equals在实际应用中也可不写。那么剩下的compare(T o1, T o2)方法是包含两个参数,所以compare(T o1, T o2)是不需要当作被比较对象的。观察Comparator还能知道,该方法使用了一个@FunctionalInterface(函数式接口)注解,那么该接口可被Lambda表达式实现,也就是说该接口是在用到的时候再定义。
从上面的分析中可以推出这两个接口的使用范围,Comparable接口需要在被比较类中实现,所以该类必须是可以能够被后来者更改的,然而从编程的角度来看,除非是这个类的创建者,否则其他人根本不会(不能)去改,而且对于引用的包类来说更加不会改了。并且基于代码的向下兼容性,如果对于该对象的比较需求发生了变化,那么这个方法是不能用的。所以Comparable接口使用范围仅限于初次创建的类,或者说能够更改源码的类并且是作为默认的比较方法。相对来说对于Comparator接口的适用范围是,被比较类不能更改,短期使用,特殊情况,动态绑定。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页