Java中比较器Comparator和Comparable的区别

 更新时间:2023年08月18日 08:59:06   作者:刘婉晴  
这篇文章主要介绍了Java中比较器Comparator和Comparable的区别,我们在使用 Collections.sort()对链表进行排序时,常常需要根据不同情况自定义排序规则,今天我们来看看比较器之间的区别,需要的朋友可以参考下

一、背景

我们在使用 Collections.sort() 对链表进行排序(或者使用 Arrays.sort() 对数组进行排序)时,常常需要根据不同情况自定义排序规则。

比如:当我们存储学生对象时,我们需要按照学生年龄进行排序,这时我们就可以通过比较器 Comparator 或者 Comparable 对排序顺序进行控制。

本文将结合示例对 Comparator 和 Comparable 两种比较器的使用进行介绍

二、Comparable

Comparable 是一个接口,其本质上是一个内比较器(在类内部)。

需要定义排序/比较规则的类实现 Comparable 接口,并且重写 compareTo(Object o) 方法,从而自定义比较规则。

public interface Comparable<T>

Comparable 代码示例 :

下面的代码为 Student 类重写了 compareTo 方法,实现了 Student 对象按照 age 大小进行比较

public class Student implements Comparable<Object> {
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "{" + this.getName() + "," + this.getAge() + "}";
    }
    // 通过重写 compareTo 方法,实现比较器
    @Override
    public int compareTo(Object o) {
        Student student = (Student) o;
        return this.age - student.getAge();
    }
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("wanqing", 21));
        list.add(new Student("xinyu", 23));
        list.add(new Student("huahua", 1));
        Collections.sort(list);
        System.out.println(list);
    }
}

可以观察到输出结果按照 age 升序进行了排序 ——

在这里插入图片描述

三、Comparator

Comparator 是一个外比较器,其使用场景为当一个类未实现 Comparable 方法,或者实现的 Comparable 方法的比较规则不是我们现在想用的(比如我们想按照降序的方式排序),我们就可以通过为 sort() 方法传入 Comparator 的形式,自定义排序规则。

其使用方式如下:

Collections.sort(List<T> list, Comparator<? super T> c);
Arrays.sort(T[] a, Comparator<? super T> c);

Comparator 重写 compare 方法,方法内部重写比较规则

Comparator 代码示例

下面代码通过传入 Comparator比较器 的方式,实现了对 list 按照学生年龄降序排序

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("wanqing", 21));
        list.add(new Student("xinyu", 23));
        list.add(new Student("huahua", 1));
        // 实现对 list 按照学生年龄降序排序
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 降序排序
                return o2.getAge() - o1.getAge();
            }
        });
        System.out.println(list);
    }

可以观察到输出结果按照 age 进行了降序排序 ——

在这里插入图片描述

到此这篇关于Java中比较器Comparator和Comparable的区别的文章就介绍到这了,更多相关Java的Comparator和Comparable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合第三方技术的详细步骤

    SpringBoot整合第三方技术的详细步骤

    这篇文章主要介绍了SpringBoot整合第三方技术,包括整合Junit、整合Mybatis、整合Mybatis-plus、整合Druid,本文通过实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • spring boot starter actuator(健康监控)配置和使用教程

    spring boot starter actuator(健康监控)配置和使用教程

    这篇文章主要介绍了spring-boot-starter-actuator(健康监控)配置和使用教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Mockito+PowerMock+Junit单元测试用途解析

    Mockito+PowerMock+Junit单元测试用途解析

    本文介绍单元测试在开发和DevOps中的规范要求,详解Mockito和PowerMock的使用,包括解耦依赖、模拟行为、验证调用及参数匹配,同时说明SpringBoot测试注解(如@MockBean)的用法,并提及IDEA插件Squaretest的自动化测试生成功能,感兴趣的朋友一起看看吧
    2025-06-06
  • java8中的lambda表达式,看这篇绝对够

    java8中的lambda表达式,看这篇绝对够

    这篇文章主要介绍了java8中的lambda表达式,看这篇绝对够!具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java实现马踏棋盘的算法

    java实现马踏棋盘的算法

    这篇文章主要为大家详细介绍了java实现马踏棋盘的算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • springboot接收json数据时,接收到空值问题

    springboot接收json数据时,接收到空值问题

    这篇文章主要介绍了springboot接收json数据时,接收到空值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot接口加密与解密的实现

    SpringBoot接口加密与解密的实现

    这篇文章主要介绍了SpringBoot接口加密与解密的实现
    2023-10-10
  • Java判断闰年的2种方法示例

    Java判断闰年的2种方法示例

    这篇文章主要给大家介绍了关于Java判断闰年的2种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Java如何获取客户端mac地址

    Java如何获取客户端mac地址

    在用户登录时,通过获取IP地址来识别计算机的MAC地址,然后将用户账号与该MAC地址进行绑定,确保每个账号只能在一台特定的计算机上登录,增强系统安全性,这种方法适用于需要严格账户安全管理的场景
    2024-09-09
  • Nacos集群搭建过程详解

    Nacos集群搭建过程详解

    这篇文章主要为大家介绍了Nacos集群搭建过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论