jdk1.8.0_144

一知半解写代码, 集合排序用个啥。 抄起键盘胡乱打, 似懂非懂最可怕。

  Comparable与Comparator都是用于集合的排序,对于大多数人来说Comparator可能略微比Comparable要熟悉一点,类似下面这几句代码的使用频率应该是最高的。

Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}
});

  这是一段对集合排序的代码。

  对于集合排序时比较器的使用往往止步于此,以至于更为深层次的使用似懂非懂,更为复杂的排序不知所措。

  Comparable用于集合内部定义的方法实现的排序,Comparator用于集合外部实现的排序。

  我们从Collections.sort的两个重载方法开始

public static <T extends Comparable<? super T>> void sort(List<T> list)

public static <T> void sort(List<T> list, Comparator<? super T> c)

  这两个方法都是泛型方法,第一个方法只传递一个List参数进行排序,第二个方法传递一个List参数加上一个Comparator比较器。

public static <T extends Comparable<? super T>> void sort(List<T> list)

  Collections.sort方法用于对List集合进行排序,思考一个问题,这个只有一个参数的List如何进行排序呢?它是按照怎样的规则进行排序呢?答案就在这个泛型方法的泛型类型之中“<T extends Comparable<? super T>>”,List集合中的元素需要实现Comparable接口,Comparable接口也是一个泛型,并要求它的泛型类型需要是集合中的元素的超类(或自身)。重点在于——集合中的元素需要是实现Comparable接口。也就是说在使用Collections.sort(List)这个方法对集合中的元素进行排序时,需要集合中的元素实现了Comparable接口,这才能进行排序。

 

public static <T> void sort(List<T> list, Comparator<? super T> c)

  这个方法同样是一个泛型方法,与上面的方法不同的是对集合中的元素类型并没有做限制,要对这个集合进行排序需要指定一个Comparator比较器,这个比较器的泛型类型需要是集合元素的超类(或自身)。

  通过上面这两个方法比较容易的能得出一个浅显的结论,Comparable和Comparator都是用于比较、排序,如果元素自身已经实现了Comparable接口,则可以利用它自身进行比较排序,如果元素自身没有实现Comparable接口,则可以利用外部实现Comparator比较器对元素进行比较排序。这也就是前面提到的Comparable用于集合内部定义的方法实现的排序,Comparator用于集合外部实现的排序。 接着来看Comparable接口和Comparator接口。

  接着来看Comparable接口和Comparator接口。

Comparable

public int compareTo(T o)

  这个接口只定义了一个compareTo方法,在很多“值类型”的数据类型,例如String、Integer、Long等已经实现了这个接口。

  对于这个方法和equals方法有类似的地方,equals强调的更多是相等于否,而compareTo强调更多的比较,如果x < y,则返回-1;x = y,则返回0;x > y,则返回1。实现这个方法时同样需要遵循几个规则:

  1. 自反性,如果x <y ,那么x.compareTo(y)返回-1,同理y.compareTo则返回1;
  2. 传递性,如果x.compareTo(y)返回-1,y.compareTo(z)返回-1,则x.compareTo(z)也应该返回-1;
  3. 同一性,如果x.compareTo(y)返回0(x = y),那么若x.compareTo(z)返回-1时,y.compareTo(z)也应该返回-1。

  有兴趣的可以查看String类中对于compareTo方法的实现,它的排序规则是将字符串转换为字符数组逐个按照字典序排序。

Comparator

int compare(T o1, T o2)

boolean equals(Object obj)

  这个接口在JDK8中对它进行了较大的改进,在JDK8之前只包含上面两个方法,而JDK8则达到了18个方法,其中都是接口的default方法,和static静态方法,所以并不需要在实现时额外实现。

  在JDK8中该类添加了@FunctionalInterface函数式接口的注解,函数式接口表明在接口中只含有一个方法作为Lambda表达式的数据类型,在《JDK8的新特性——Lambda表达式》中有提到,Java中定义如果覆盖了Object中的方法则不算,所以在Comparator接口中只有一个compare方法。对于@FunctionalInteface注解可加不可加,加上只是为了让编译器做更好的检查,要求只能定义一个方法,不加编译器便不对此进行检查。

  compare方法和compareTo方法类似,它同样需要满足上面提到的:自反性、传递性、同一性。并且它强调,不必严格满足“(compare(x, y)==0) == (x.equals(y))”,当然最好说明白。

  对于这个类,更多的是需要理解学习它所运用的设计模式——策略模式。策略模式,不改变对象自身,而是用另一个对象来改变它的行为。例如,超市减价操作,有10件商品需要统一降价1半进行处理,我们可以在这10件商品的价格上全部做修改减少至它的一半,10件好处理,如果N件呢,甚至我们还需要对其进行降价呢?此时我们则可以使用一种“策略”——商品全部打5折。这就是利用另外一个对象来改变一个对象的行为,而不是简单粗暴地修改原有对象。说回此处,如果List中的元素本身没有实现Comparable接口,但我们需要对它进行排序,我们可以对原有对象进行修改让它实现Comparable接口,但凡涉及修改代码都不优美,此时我们则可以利用策略模式,也就是实现一个Comparator接口对集合中的元素进行排序。

这是一个能给程序员加buff的公众号 

似懂非懂的Comparable与Comparator相关推荐

  1. Java 中 Comparable 和 Comparator 比较

    为什么80%的码农都做不了架构师?>>>    本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comp ...

  2. Java 解惑:Comparable 和 Comparator 的区别

    读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢? ...

  3. 对象比较:Comparable 和 Comparator

    java中我们如何给对象排序?这就必须借助Comparator 或 Comparable.有了他们就意味着你可用实现对象之间的比较.也就可用做到排序了. Comparable Comparable 也 ...

  4. Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

    1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1) ...

  5. java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序

    本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...

  6. Java中Comparable和Comparator区别小结

    阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Comparable简介 Comparable是排序接口.若 ...

  7. comparable和comparator比较

      今天在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparat ...

  8. Java中Comparable与Comparator的区别

    一.概述 Comparable和Comparator都是用来实现集合中元素的比较.排序的. Comparable是在集合内部定义的方法实现的排序,位于java.util下. Comparator是在集 ...

  9. Comparable与Comparator浅析

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  10. Java中Comparable和Comparator接口区别分析

    本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...

最新文章

  1. Mycat源码中的单例模式
  2. 浙江高考艺术类2021年成绩查询,2021年浙江美术高考成绩查询网址:https://www.zjzs.net/...
  3. Mysqldump逻辑备份与恢复
  4. 计算机管理未指定错误,win10系统计算机管理打不开显示有“未指定的错误”的方案介绍222...
  5. SQL语法的重要知识点总结
  6. github博客突然无法访问_紫菜头博客被DNS污染攻击关站
  7. 被小程序冲击的人,请正视小程序!
  8. python游戏房间_Python House冒险-如果已经进入一个房间,如何给出不同的输出
  9. java二次方程式答案_二次方程式Java?
  10. 数据分析数据挖掘(二)
  11. MySql 优化----- 慢查询
  12. cesium相机控制
  13. 软件开发方法的过程、特点、优缺点
  14. Python内进制转换(2进制,8进制,10进制,16进制转换)
  15. javascript实现日历功能
  16. Unirech腾讯云国际版代充-使用RDP文件登录到Windows云服务器实例教程
  17. Python中利用正则表达式做数据清洗(re)
  18. python程序红绿灯识别_使用python创建红绿灯
  19. java sql 违反协议_java.sql.SQLException: 违反协议异常的一种解释
  20. Dataframe中筛选出满足条件的行

热门文章

  1. 串口通讯(DMA模式)
  2. Oracle系列--基础理论
  3. 螺旋数字的python实现
  4. 用Gradle 构建你的android程序
  5. HTTP协议中GET、POST和HEAD的介绍
  6. 2020MySQL安装(MSI超级简单一键next)
  7. 工厂模式(简单、普通、抽象)
  8. Luogu2481 SDOI2010 代码拍卖会 DP、组合
  9. [机器学习]推荐系统之协同过滤算法
  10. 不知不觉,写了一个编译器(一)