深入分析Comparable与Comparator的区别

本文探讨了Comparable与Comparator两个接口在Java中用于对象比较的差异,指出Comparable适用于类内初始比较,Comparator则更适合动态绑定和跨类比较。通过源码分析和实用性讲解,揭示了两者的设计目的和适用场景。
摘要由CSDN通过智能技术生成

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接口的适用范围是,被比较类不能更改,短期使用,特殊情况,动态绑定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值