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接口的使用和区别相关推荐

  1. Java基础之Comparable接口和Comparator接口的比较

    前言 就是普普通通的写这么一篇文章,java集合类估计java程序猿都知道,那就写一点小众的. 在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那 ...

  2. Comparable接口和Comparator接口

    目录 1 介绍 2 Comparable接口 3 Comparator接口 4 总结 1 介绍 有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要 ...

  3. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  4. Comparable接口和Comparator接口的比较

    1.Comparable详解 1.1Comparable概述 来自java.lang.Comparable.Comparable是 排序接口.若一个类实现了Comparable接口,就意味着该类支持排 ...

  5. 深入理解 Comparable 接口和 Comparator 接口以及Arrays.sort()

    compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接 ...

  6. Java中比较对象的两个接口Comparable接口和Comparator接口

    2019独角兽企业重金招聘Python工程师标准>>> jdk文档是这样介绍的 1.  public interface  Comparable<T>:此接口强行对实现它 ...

  7. Comparable接口与Comparator接口

    [Comparable和Comparator源码] java.lang.Comparablepublic interface Comparable<T> {public int compa ...

  8. Java 中类的比较与排序方法(应用Comparable接口与Comparator接口)通俗易懂

    引言 在平时写Java的程序的时候,如果要进行一些基本类型的变量的比较,可以很方便得调用Math.max().Math.min()等方法,如果要对数组或者列表进行排序,也可以用Arrays.sort( ...

  9. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法

    原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...

最新文章

  1. Operation Queues并发编程
  2. python元素定位的八种方法_selenium webdriver基于Python系列之八种元素定位方法
  3. MonoDevelop笔记
  4. ASP.NET Core 之 Identity 入门(三)
  5. 如果有这样一台服务器……
  6. 生活质量衡量系统_数据质量与数据质量八个维度指标
  7. 如何修改和配置idea编辑器的编码
  8. python开源项目博客_2020年7月最热门的Python开源项目
  9. MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)
  10. 2022年6月25日PMP考试通关宝典-1
  11. 简述:bs和cs的区别
  12. 搭窝---开篇语---爆笑语录
  13. 适配IE浏览器的那些坑
  14. excel2010将数字变成以文本存储的数字
  15. 电脑桌面app客户端、微信公众号-小程序测试方法
  16. Gremlin 基础知识
  17. 永信至诚成功当选CNCERT网络安全应急服务支撑单位
  18. xsl:apply-templates和xsl:call-template的区别
  19. 汇编指令MCR/MRC
  20. Linux琐碎知识汇总

热门文章

  1. Excel如何实现表单编号自动递增?
  2. java+ssm详解_ssm整合详解
  3. 数据库之删除表数据drop、truncate和delete的用法
  4. sed命令的作用linux,Linux重要命之sed命令详解
  5. 微信Android客户端中表情雨效果的实现
  6. Suterusu对话Waves | 隐私, DeFi繁荣的关键
  7. 计算机网络的利与弊,网络的利与弊
  8. 无线网卡显示无服务器,无线网卡连接不可用怎么办_无线显示连接不可用怎么解决-win7之家...
  9. ArcGisPro脚本工具【0】——制作你的第一个脚本工具
  10. Java基础之Java枚举