Comparator,Comparable接口区别及应用

本文详细解释了Comparable与Comparator两个接口的区别及应用场景,并介绍了如何利用这两个接口实现类对象之间的比较和排序,同时给出了具体的代码示例。
comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合 collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像C++ STL中的函数对象一样。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。

一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。
而Comparator的作用有两个:
1、如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过Comparator来实现比较算法进行排序
2、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序

     如果你对数据结构和算法都很熟悉,那你大可自己编写高效的排序方法。但是如果你对此不是很熟的话, JDK 中为你提供了非常方便的类: java.util.Arrays 和 java.util.Collection 。
     其中,java.util.Arrays 主要是对对象数组进行处理,包括对对象数组填值、查找、比较、排序等。而 java.util.Collection 也具有同样的功能,只是它所处理的对象是对象链表。而且它们的这些方法都是静态的,可以直接调用。下面是具体的例子:

//给对象数组排序
Object[] objects = getObjectArray(); //取得你要排序的对象数组
Arrays.sort( objects );

//给对象链表排序
List objectList = getObjectList(); //取得你要排序的对象链表
Collections.sort( objectList );

注意:使用上述方法时,对象数组或对象链表中的对象必须实现接口:java.lang.Comparable

更加详细的关于集合框架的内容请关注本人的另一片文章:Java集合框架

### Java 中 ComparableComparator区别 #### 1. 定义与功能 `Comparable` 接口定义了一个类自身的自然排序方式,通常用于表示该类型的对象如何按照其固有属性进行比较。它通过实现 `compareTo(T other)` 方法来指定排序逻辑[^1]。 相比之下,`Comparator` 是一个独立于目标类的外部比较器接口,允许开发者为同一个类提供多种不同的排序策略。这使得即使某个类已经实现了自己的 `Comparable` 接口,仍然可以通过编写额外的 `Comparator` 来扩展或覆盖默认行为[^2]。 #### 2. 使用方法 当一个类需要具备固定的、单一的排序规则时,可以考虑让这个类直接继承并实现 `Comparable<T>` 接口。例如,在处理日期类型的数据结构时,默认按时间先后顺序排列就是一种典型的例子[^3]: ```java public class Date implements Comparable<Date> { private int year; public Date(int y){ this.year = y; } @Override public int compareTo(Date anotherDate) { return Integer.compare(this.year, anotherDate.year); } } ``` 然而对于那些可能依据不同条件变化而改变相对次序的情况,则更适合采用 `Comparator` 方式来进行动态调整。比如下面展示的成绩降序排列案例就很好地体现了这一点: ```java import java.util.*; class Demo{ double score; public Demo(double s){this.score=s;} public double getScore(){return score;} } // 成绩由高到低排序 class ScoreSortDesc implements Comparator<Demo>{ @Override public int compare(Demo d1,Demo d2 ){ return Double.compare(d2.getScore(),d1.getScore()); } } List<Demo> list=new ArrayList<>(); list.add(new Demo(90)); list.add(new Demo(87)); Collections.sort(list,new ScoreSortDesc()); for (Demo demo : list) System.out.println(demo.getScore()); ``` 上述代码片段展示了如何利用自定义的 `Comparator` 对象对学生分数列表执行从大到小的排序操作。 #### 3. 设计哲学上的差异 - **Comparable**: 这种机制反映了面向对象编程中的封装原则——即把数据以及针对这些数据的操作紧密结合起来形成统一的整体;因此适用于希望内部维护自己特定关系的对象集合。 - **Comparator**: 提供了一种更加灵活多变的选择方案,尤其适合那种无法修改源码或者不想污染原有业务逻辑的情形下引入新的判定标准. --- ### 总结表格对比 | 特性 | Comparable | Comparator | |-------------------|------------------------------------|----------------------------------| | 实现位置 | 类本身 | 外部单独创建 | | 是否侵入原类 | 需要修改原始类 | 不需改动任何现有代码 | | 自然/人为排序 | 表达的是事物本身的天然秩序 | 支持任意定制化的临时需求 | | 单一还是多样排序 | 只能有一种固定模式 | 能够同时拥有多个版本 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值