Jet_Morgan 2022-09-03 17:20 采纳率: 100%
浏览 14
已结题

comparable与comparator接口有什么区别

有个问题想请教各位一下,comparable与comparator接口有什么区别?

  • 写回答

3条回答 默认 最新

  • 叶孤崖 2022-09-03 17:31
    关注

    相同点: Comparable 和 Comparator 都是用来实现集合中元素的比较、排序的
    不同点:
    1 接口定义的方法不同
    Comparable接口里面的方法是 public int compareTo(T o); 在java.lang包下
    Comparator接口里面的方法是 int compare(T o1,T o2); 在java.util包下
    2 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer,Float、Double等 自己就可以完成比较大小操作,已经实现了Comparable接口),自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,这里的自然顺序就是实现Comparable接口设定的排序方式。
    而 Comparator 是一个专用的比较器,在集合外部实现的排序,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
    用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。 比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

    简单说一个是自已完成比较,一个是外部程序实现比较的差别而已。
    或者说Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序。

    工作中如何使用:
    1 一个类既可以实现Comparable接口也可以实现Comparator接口。
    如果希望一个类的比较方式有很多种,而且比较方式具有外部扩展性,那么可以实现Comparator接口,如果一个类默认的实现了Comparable接口,而你又希望再定义一个比较规则,那么你不可能去修改原类,因为这样会破坏封闭开放原则,最好的方法是写一个实现了Comparator接口的类。总的来说,Comparator接口比Comparable接口要灵活。

    2 如果一个集合类中存放着一些对象,如果希望对这个集合进行排序,可以使用Collections类里面的sort方法,或Arrays.sort();
    比如 sort方法有两种重载形式。
    sort(Collection c); 这种方法是根据类T里面默认的排序规则来排序的,即类T里面的compareTo方法
    sort(Collection c,Comparator com);这种方法是根据类外面传进来的Comparator实现类类排序的。可以自己定义排序规则。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月11日
  • 已采纳回答 9月3日
  • 创建了问题 9月3日

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c