Comparable接口和Comparator接口的使用和区别
Comparable
Comparable接口在JDK8中的源码:
package java.lang;
import java.util.*;package java.lang;
public interface Comparable<T> {public int compareTo(T o);
}
用法:
public class User implements Comparable<User>{private Integer id;private Integer age;public User() {}public User(Integer id, Integer age) {this.id = id;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", age=" + age +'}';}public int compareTo(User o) {if(this.age > o.getAge()) {return 1;}else if(this.age < o.getAge()) {return -1;}else{return 0;}}
}
public class Test {public static void main(String[] args) {User user1 = new User(1, 14);User user2 = new User(2, 12);User user3 = new User(3, 10);User[] users = {user1, user2, user3};Arrays.sort(users);Arrays.stream(users).forEach(System.out::println);}
}
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
参数: o - 要比较的对象。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:ClassCastException - 如果指定对象的类型不允许它与此对象进行比较
Comparator
Comparator接口在JDK8中的源码:
package java.util;import java.io.Serializable;
import java.util.function.Function;
import java.util.function.ToIntFunction;
import java.util.function.ToLongFunction;
import java.util.function.ToDoubleFunction;
import java.util.Comparators;public interface Comparator<T> {int compare(T o1, T o2);//还有很多其他方法...
}
使用:
public class Child {private Integer id;private Integer age;public Child() {}public Child(Integer id, Integer age) {this.id = id;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Child{" +"id=" + id +", age=" + age +'}';}
}
public class Test {public static void main(String[] args) {Child child1 = new Child(1, 14);Child child2 = new Child(2, 12);Child child3 = new Child(3, 10);List<Child> list = new ArrayList<>();list.add(child1);list.add(child2);list.add(child3);Collections.sort(list, new Comparator<Child>() {@Overridepublic int compare(Child o1, Child o2) {return o1.getAge() > o2.getAge() ? 1 : (o1.getAge() == o2.getAge() ? 0 : -1);}});// 或者使用JDK8中的Lambda表达式//Collections.sort(list, (o1, o2) -> (o1.getAge()-o2.getAge()));list.stream().forEach(System.out::println);}
}
或者也可以通过实现的方式使用Comparator接口:
import java.util.Comparator;public class Child implements Comparator<Child> {private Integer id;private Integer age;public Child() {}public Child(Integer id, Integer age) {this.id = id;this.age = age;}@Overridepublic int compare(Child o1, Child o2) {return o1.getAge() > o2.getAge() ? 1 : (o1.getAge() == o2.getAge() ? 0 : -1);}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Child{" +"id=" + id +", age=" + age +'}';}
}
public class Test {public static void main(String[] args) {Child child1 = new Child(1, 14);Child child2 = new Child(2, 12);Child child3 = new Child(3, 10);List<Child> list = new ArrayList<>();list.add(child1);list.add(child2);list.add(child3);Collections.sort(list, new Child());list.stream().forEach(System.out::println);}
}
Comparator接口其他默认方法的用法
reversed方法
default Comparator<T> reversed() {return Collections.reverseOrder(this);}
这个方法是用来生成一个逆序器,比如我们开始需要得到一个正序的排序序列,然后又想得到一个反转的排序序列,就可以使用该方法。比如:
public class Test {public static void main(String[] args) {Child child1 = new Child(1, 14);Child child2 = new Child(2, 12);Child child3 = new Child(5, 10);Child child4 = new Child(4, 10);List<Child> list = new ArrayList<>();list.add(child1);list.add(child2);list.add(child3);list.add(child4);Comparator<Child> comparator = Comparator.comparingInt(x -> x.getAge());Collections.sort(list, comparator);list.stream().forEach(System.out::println);Collections.sort(list, comparator.reversed());list.stream().forEach(System.out::println);}
}
thenComparing
default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor){return thenComparing(comparing(keyExtractor));}
该方法是在原有的比较器上再加入一个比较器,比如先按照年龄排序,年龄相同的在按照id排序。比如:
public class Test {public static void main(String[] args) {Child child1 = new Child(1, 14);Child child2 = new Child(2, 12);Child child3 = new Child(5, 10);Child child4 = new Child(4, 10);List<Child> list = new ArrayList<>();list.add(child1);list.add(child2);list.add(child3);list.add(child4);Comparator<Child> comparator = Comparator.comparingInt(x -> x.getAge());Collections.sort(list, comparator);list.stream().forEach(System.out::println);System.out.println("-----");Collections.sort(list, comparator.thenComparing(x->x.getId()));list.stream().forEach(System.out::println);}
}
Comparable接口和Comparator接口的区别
- Comparable接口位于java.lang包下;Comparator位于java.util包下
- Comparable接口只提供了一个compareTo()方法;Comparator接口不仅提供了compara()方法,还提供了其他默认方法,如reversed()、thenComparing(),使我们可以按照更多的方式进行排序
- 如果要用Comparable接口,则必须实现这个接口,并重写comparaTo()方法;但是Comparator接口可以在类外部使用,通过将该接口的一个匿名类对象当做参数传递给Collections.sort()方法或者Arrays.sort()方法实现排序。Comparator体现了一种策略模式,即可以不用要把比较方法嵌入到类中,而是可以单独在类外部使用,这样我们就可有不用改变类本身的代码而实现对类对象进行排序。
Comparable接口和Comparator接口的使用和区别相关推荐
- Java基础之Comparable接口和Comparator接口的比较
前言 就是普普通通的写这么一篇文章,java集合类估计java程序猿都知道,那就写一点小众的. 在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那 ...
- Comparable接口和Comparator接口
目录 1 介绍 2 Comparable接口 3 Comparator接口 4 总结 1 介绍 有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要 ...
- Java6.0中Comparable接口与Comparator接口详解
Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...
- Comparable接口和Comparator接口的比较
1.Comparable详解 1.1Comparable概述 来自java.lang.Comparable.Comparable是 排序接口.若一个类实现了Comparable接口,就意味着该类支持排 ...
- 深入理解 Comparable 接口和 Comparator 接口以及Arrays.sort()
compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接 ...
- Java中比较对象的两个接口Comparable接口和Comparator接口
2019独角兽企业重金招聘Python工程师标准>>> jdk文档是这样介绍的 1. public interface Comparable<T>:此接口强行对实现它 ...
- Comparable接口与Comparator接口
[Comparable和Comparator源码] java.lang.Comparablepublic interface Comparable<T> {public int compa ...
- Java 中类的比较与排序方法(应用Comparable接口与Comparator接口)通俗易懂
引言 在平时写Java的程序的时候,如果要进行一些基本类型的变量的比较,可以很方便得调用Math.max().Math.min()等方法,如果要对数组或者列表进行排序,也可以用Arrays.sort( ...
- java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...
最新文章
- Operation Queues并发编程
- python元素定位的八种方法_selenium webdriver基于Python系列之八种元素定位方法
- MonoDevelop笔记
- ASP.NET Core 之 Identity 入门(三)
- 如果有这样一台服务器……
- 生活质量衡量系统_数据质量与数据质量八个维度指标
- 如何修改和配置idea编辑器的编码
- python开源项目博客_2020年7月最热门的Python开源项目
- MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)
- 2022年6月25日PMP考试通关宝典-1
- 简述:bs和cs的区别
- 搭窝---开篇语---爆笑语录
- 适配IE浏览器的那些坑
- excel2010将数字变成以文本存储的数字
- 电脑桌面app客户端、微信公众号-小程序测试方法
- Gremlin 基础知识
- 永信至诚成功当选CNCERT网络安全应急服务支撑单位
- xsl:apply-templates和xsl:call-template的区别
- 汇编指令MCR/MRC
- Linux琐碎知识汇总
热门文章
- Excel如何实现表单编号自动递增?
- java+ssm详解_ssm整合详解
- 数据库之删除表数据drop、truncate和delete的用法
- sed命令的作用linux,Linux重要命之sed命令详解
- 微信Android客户端中表情雨效果的实现
- Suterusu对话Waves | 隐私, DeFi繁荣的关键
- 计算机网络的利与弊,网络的利与弊
- 无线网卡显示无服务器,无线网卡连接不可用怎么办_无线显示连接不可用怎么解决-win7之家...
- ArcGisPro脚本工具【0】——制作你的第一个脚本工具
- Java基础之Java枚举