似懂非懂的Comparable与Comparator
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。实现这个方法时同样需要遵循几个规则:
- 自反性,如果x <y ,那么x.compareTo(y)返回-1,同理y.compareTo则返回1;
- 传递性,如果x.compareTo(y)返回-1,y.compareTo(z)返回-1,则x.compareTo(z)也应该返回-1;
- 同一性,如果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相关推荐
- Java 中 Comparable 和 Comparator 比较
为什么80%的码农都做不了架构师?>>> 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comp ...
- Java 解惑:Comparable 和 Comparator 的区别
读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢? ...
- 对象比较:Comparable 和 Comparator
java中我们如何给对象排序?这就必须借助Comparator 或 Comparable.有了他们就意味着你可用实现对象之间的比较.也就可用做到排序了. Comparable Comparable 也 ...
- Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)
1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1) ...
- java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序
本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...
- Java中Comparable和Comparator区别小结
阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Comparable简介 Comparable是排序接口.若 ...
- comparable和comparator比较
今天在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparat ...
- Java中Comparable与Comparator的区别
一.概述 Comparable和Comparator都是用来实现集合中元素的比较.排序的. Comparable是在集合内部定义的方法实现的排序,位于java.util下. Comparator是在集 ...
- Comparable与Comparator浅析
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- Java中Comparable和Comparator接口区别分析
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...
最新文章
- Mycat源码中的单例模式
- 浙江高考艺术类2021年成绩查询,2021年浙江美术高考成绩查询网址:https://www.zjzs.net/...
- Mysqldump逻辑备份与恢复
- 计算机管理未指定错误,win10系统计算机管理打不开显示有“未指定的错误”的方案介绍222...
- SQL语法的重要知识点总结
- github博客突然无法访问_紫菜头博客被DNS污染攻击关站
- 被小程序冲击的人,请正视小程序!
- python游戏房间_Python House冒险-如果已经进入一个房间,如何给出不同的输出
- java二次方程式答案_二次方程式Java?
- 数据分析数据挖掘(二)
- MySql 优化----- 慢查询
- cesium相机控制
- 软件开发方法的过程、特点、优缺点
- Python内进制转换(2进制,8进制,10进制,16进制转换)
- javascript实现日历功能
- Unirech腾讯云国际版代充-使用RDP文件登录到Windows云服务器实例教程
- Python中利用正则表达式做数据清洗(re)
- python程序红绿灯识别_使用python创建红绿灯
- java sql 违反协议_java.sql.SQLException: 违反协议异常的一种解释
- Dataframe中筛选出满足条件的行