这里写目录标题

  • Comparable的使用
  • Comparator比较器
  • Comparator和Comparable的区别

Comparable的使用

1.1、我们创建一个Student(学生)类

class Student {public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "{" + "age=" + age +", name='" + name + "}";}
}

1.2、我们来进行测试

    public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student(22,"LeeSin");students[1] = new Student(26,"Ashy");students[2] = new Student(24,"Timor");Arrays.sort(students);//Exception in thread "main" java.lang.ClassCastException: Student cannot be cast to java.lang.ComparableSystem.out.println(Arrays.toString(students));}
}

此时会发生运行时异常:
java.lang.ClassCastException: Student cannot be cast to java.lang.Comparable
这个意思就是类型转换异常。
因为自定义类型不能转换为sort原来方法中排序的类型,所以我们需要写一个比较器。

1.3、Class Student实现Comparable接口

class Student implements Comparable<Student>{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "{" + "age=" + age +", name='" + name + "}";}//通过年龄比较@Overridepublic int compareTo(Student o) {return this.age - o.age;}
}

this.age - o.age 表示当前age-传入的age,结果是升序;
如果是o.age - this.age 那么表示的是降序;

1.4我们再来测试

public class Test {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student(22,"LeeSin");students[1] = new Student(26,"Ashy");students[2] = new Student(24,"Timor");Arrays.sort(students);System.out.println(Arrays.toString(students));
//[{age=22, name='LeeSin}, {age=24, name='Timor}, {age=26, name='Ashy}]}
}

结果是[{age=22, name='LeeSin}, {age=24, name='Timor}, {age=26, name='Ashy}],我们发现数组通过年龄升序排序

1.5、同样的,我们也可以通过姓名首字母来比较

import java.util.Arrays;public class Test {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student(22,"LeeSin");students[1] = new Student(26,"Ashy");students[2] = new Student(24,"Timor");Arrays.sort(students);System.out.println(Arrays.toString(students));//[{age=26, name='Ashy}, {age=22, name='LeeSin}, {age=24, name='Timor}]}
}
class Student implements Comparable<Student>{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "{" + "age=" + age +", name='" + name + "}";}@Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}/*@Overridepublic int compareTo(Student o) {return this.age - o.age;}*/
}

结果是[{age=26, name='Ashy}, {age=22, name='LeeSin}, {age=24, name='Timor}],我们发现数组是以name首字母来排序的。

Comparator比较器

1.1我们继续使用上面的Student(学生)类

import java.util.Arrays;
import java.util.Comparator;public class ComparatorDemo {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student(22,"LeeSin");students[1] = new Student(26,"Ashy");students[2] = new Student(24,"Timor");//根据首字母排序NameComparator  nameComparator = new NameComparator();Arrays.sort(students,nameComparator);System.out.println(Arrays.toString(students));
//[{姓名=Ashy,年龄=26 }, {姓名=LeeSin,年龄=22 }, {姓名=Timor,年龄=24 }]//根据年龄排序AgeComparator ageComparator = new AgeComparator();Arrays.sort(students,ageComparator);System.out.println(Arrays.toString(students));
//[{姓名=LeeSin,年龄=22 }, {姓名=Timor,年龄=24 }, {姓名=Ashy,年龄=26 }]}
}class Student {public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return  "{" + "姓名=" + name + ",年龄=" + age + " " + "}";}}class AgeComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {return o1.age - o2.age;}
}class NameComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.name.compareTo(o2.name);}
}

结果分别是是:
[{姓名=Ashy,年龄=26 }, {姓名=LeeSin,年龄=22 }, {姓名=Timor,年龄=24 }]
[{姓名=LeeSin,年龄=22 }, {姓名=Timor,年龄=24 }, {姓名=Ashy,年龄=26 }]

Comparator和Comparable的区别

细心的同学会发现我们使用Comparable接口用name首字母比较时,
先屏蔽了重写的age比较方法。

    @Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}/*@Overridepublic int compareTo(Student o) {return this.age - o.age;}*/

因为一个类里面重写的compareTo方法只有一个,当我们选择用name首字母比较后,就不能用age大小来比较,这就是Comparable的局限性,一旦写死,只能用一种方法比较。但是我们使用Comparator比较器的时候,既可以用name比较,也可以用age比较。
当然,Comparator也可以像Comparable一样用来实现:

class Student implements Comparator<Student>{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return  "{" + "姓名=" + name + ",年龄=" + age + " " + "}";}@Overridepublic int compare(Student o1, Student o2) {return o1.age - o2.age;}
}

效果是一样的。

还有一点就是Comparable重写的是compareTo方法;
来看下Comparable源码:

    public int compareTo(T o);

只有一个需要重写的方法。
而Comparator重写的是compare方法,但是它却又很多方法。

老规矩,小白入门,如有错误,请多多包含指正。
谢谢!

另外,我另外一篇博客写了< > == 和equals的使用,链接如下,欢迎来访!!!
java中的比较== < > Comparator和 Comparable

还有一篇刷题中使用比较器的博客
字符统计与查找 和 最小的 k 最数字(Comparator 比较器实战应用)

Comparator 和 Comparable的使用及区别相关推荐

  1. Java中Comparator和Comparable之间的区别

    常见的面试问题之一是"比较器和可比较器之间有什么区别". 或"您将如何通过其ID或名称对员工对象集合进行排序".为此,我们可以使用两个接口,即Comparato ...

  2. Comparator和Comparable的区别

    一.概述   Comparable和Comparator都是两个接口,接口都可以用来实现集合中元素的比较.排序,Comparator位于包java.util下,而Comparable位于包java.l ...

  3. java的Comparator和Comparable

    java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.      ...

  4. Comparator和Comparable (转)

    Comparator和Comparable比较 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 一.Compa ...

  5. Java核心技术之Comparator和Comparable在排序中的应用

    自定义的类User: package com.example.testcomparator;public class User{private String name;private int age; ...

  6. compareto返回1和-1的区别_温故篇:Comparable与Compatator的区别

    前言: 在实际开发中,经常需要对某些数据进行比较,例如我们在网购的时候,检索某件商品,它会按照价格,收藏等等关键词展示出来,当中的展示规则便是对商品间的某个相同数据比较后所得出来的. 在Java中,数 ...

  7. Comparator和Comparable、compare的使用

    比较器排序Comparator和Comparable的使用 简述Comparable和Comparator两个接口的区别. compare是comparator里面的一个方法 Comparable:强 ...

  8. Comparator 和 Comparable

    Comparator 和 Comparable 比较 Comparable是排序接口:若一个类实现了Comparable接口,就意味着"该类支持排序". 而Comparator是比 ...

  9. 集合框架-Comparator和Comparable的区别

    Comparator也叫外部比较器,常在使用Collections工具类进行集合排序的时候使用.外部比较器Comparator可以理解为一个专用的比较器,当集合中的对象不支持自比较或者比较的功能不能满 ...

最新文章

  1. 计算机组成知识试题及答案,《计算机组成与结构复习题及答案.doc
  2. php动态交叉表,PHP Array交叉表实现代码
  3. 如何在JavaScript中声明名称空间?
  4. “CAIL 2021中国法律智能技术评测”第二赛段已全面开启!
  5. linux 信号量_SystemV IPC通信信号量
  6. 廖雪峰Git教程学习总结
  7. 施努卡:3d视觉检测方案 3d视觉检测应用行业
  8. 四LED单端输出充电仓配合TWS耳机芯片QCC3020使用
  9. phalapi init.php,PhalApi:[1.12] 参数规则:接口参数规则配置
  10. 关于浮动元素,你还在自己计算位置吗?来看看 Floating UI 吧
  11. Spring IOC(一):概述
  12. 金融数据分析与挖掘具体实现方法 -1
  13. Windows Defender 防病毒发现威胁;关闭;
  14. 调用ArcToolBox里的Tool的三种方法
  15. php支持链式操作,PHP三种方式实现链式操作-php教程
  16. 神经网络模型通用性分析,神经网络模型可解释性
  17. 视频安全之授权播放和防录屏跑马灯
  18. java代码实现在Windows中自动连接WiFi(乞丐版)
  19. 项目管理论坛_【项目管理论坛】第21期:如何做一名优秀的项目经理
  20. Java实现连连看源代码文档_JAVA实现连连看游戏

热门文章

  1. 使用intel加速器加速android模拟器
  2. 火鸟地方门户3.9全能完整无错版源码 新增二手车模块
  3. 转贴一篇经典文章--条件判定覆盖和修正条件判定覆盖的差异
  4. 星环科技ArgoDB 3.2正式发布,全面升级易用性、性能和安全
  5. SpringBoot重点详解--@JoinColumn注解
  6. 看数字区别使用塑料瓶
  7. 计算一个实数的平方根
  8. 水务行业现状和问题梳理
  9. 【Java】代理模式(静态代理动态代理)
  10. 全面解决Generic host process for win32 services遇到问题需要关闭