• Comparable和Comparator接口


    目录

    Comparable接口

    Comparator接口(比较器)

    Comparable接口和Comparator的比较

    总结


    Comparable接口

    作用:实现对引用数据类型的比较和排序
    使用:待比较类实现接口并且覆写接口中的compareTo方法
    实例

    1. public class Person {
    2. private String name;//姓名
    3. private int age;//年龄
    4. public Person(String name,int age) {
    5. this.name = name;
    6. this.age = age;
    7. }
    8. public String getName() {
    9. return name;
    10. }
    11. public void setName(String name) {
    12. this.name = name;
    13. }
    14. public int getAge() {
    15. return age;
    16. }
    17. public void setAge(int age) {
    18. this.age = age;
    19. }
    20. @Override
    21. public String toString() {
    22. return "姓名:" + name + " 年龄:" + age;
    23. }
    24. }

    对于上述的Person类,现在有四个实例化对象,现在要对这四个实例化对象通过使用Comparable接口按照年龄或者其他属性进行排序,那么就需要Person类实现Comparable接口并且覆写compareTo方法:

    1. public class Person implements Comparable {
    2. ....
    3. @Override
    4. public int compareTo(Person o) {
    5. //return o.age - this.age; //降序排列
    6. return this.age - o.age; //升序排列
    7. }
    8. }

    测试

    1. public class ComparableTestDrive {
    2. public static void main(String[] args) {
    3. Person[] person = new Person[4];
    4. person[0] = new Person("huahua",18);
    5. person[1] = new Person("niuniu",19);
    6. person[2] = new Person("manage",28);
    7. person[3] = new Person("shuaishuai",17);
    8. Arrays.sort(person);
    9. System.out.println(Arrays.toString(person));
    10. }
    11. }
    12. //输出:(年龄升序)
    13. //[姓名:shuaishuai 年龄:17, 姓名:huahua 年龄:18, 姓名:niuniu 年龄:19, 姓名:manage 年龄:28]

     Comparator接口(比较器)

    Comparator也可用于引用数据类型的排序,相对于Comparable接口有自己独特的优势,Comparator和Compareable接口的比较写在第三部分。

    对于上述的Person类,如果使用Comparator接口来实现按年龄或者其他属性来进行排序,可以不用再去操作Person类,而只需要在使用排序方法的时候使用匿名内部类实现其中的compare方法,会发现这种比较方法实现的排序不用再依赖于待比较的类型,实现了比较和对象类型的解离,这样即使再使用非自定义类时,也可以通过该接口实现期望的数据排序。
    测试(不用操作Person类):

    1. public class ComparableTestDrive {
    2. public static void main(String[] args) {
    3. Person[] person = new Person[4];
    4. person[0] = new Person("huahua",18);
    5. person[1] = new Person("niuniu",19);
    6. person[2] = new Person("manage",28);
    7. person[3] = new Person("shuaishuai",17);
    8. Arrays.sort(person, new Comparator() {
    9. @Override
    10. public int compare(Person o1, Person o2) {
    11. //return o2.getAge() - o1.getAge();//降序排列
    12. return o1.getAge() - o2.getAge();//升序排列
    13. }
    14. });
    15. System.out.println(Arrays.toString(person));
    16. }
    17. }
    18. //输出(按年龄升序的结果):
    19. //[姓名:shuaishuai 年龄:17, 姓名:huahua 年龄:18, 姓名:niuniu 年龄:19, 姓名:manage 年龄:28]

    Comparable接口和Comparator的比较

    字面含义的区别

    • Comparable以able结尾,更代表着一种功能,例如上述的Person类在实现Comparable接口后可以理解为Person类的对象之间具有了比较的功能
    • Comparator意为比较器,更像一种用于比较的工具或者说是比较的参与者。

    用法的区别

    • 使用Comparable接口来实现对象之间的比较或者排序,就必须在对象对应类中实现Comparable接口并且覆写compareTo方法
    • 使用Comparator接口来实现对象的排序,可以使用匿名内部类在排序类的外部实现Conparator接口并且重写compare方法

    应用场景区别

    • 使用Comparable接口实现排序,必须对排序类的内部进行操作
    • 使用Comparator比较器接口可以实现比较对象和比较器的解离,在类的外部通过匿名内部类进行对象间的比较

    总结

    Comparable和Comparator接口都可以用于自定义对象之间的比较排序,不同的是,使用Comparable接口必须操作比较类,需要覆写compareTo方法,这样当使用第三方提供的类进行对象的排序时,就很难进行操作;而使用Comparator接口可以不用再操作比较类而通过匿名内部类覆写compare方法实现比较对象的排序。所以Comparable更像是“对内”进行排序的接口,而Compator比较器实现了与比较类d额解耦,在不修改比较类的同时实现排序,因此更像是“对外”提供排序的接口。

  • 相关阅读:
    Knapsack Problem
    力扣第406题 根据身高重建队列 c++ 贪心思维
    如何启动联盟计划:成功的6个步骤
    docker-linux-teamcity没有vi/vim/ping/ 并且apt-get update也不能用咋办?
    第10章 初识SqlSugarCore之NPOI Excel导出
    软件测试经典面试题【必备100道】
    Sql语句大全--更新
    刷题记录:牛客NC205036答题卡
    重新认识下JVM级别的本地缓存框架Guava Cache——优秀从何而来
    C++编程基础|多级指针
  • 原文地址:https://blog.csdn.net/weixin_64450588/article/details/127937436