Comparable 与 Comparator

傻傻的分不清 Comparator 和 Comparable 接口? 两分钟弄懂~ 依赖于 compareTo 方法进行比较,该方法只有一个参数,就是要比较的对象。怎么使用呢?例如我们有一个 Student 类,需要按照年龄进行升序排序,那么就可以让该类实现 comparable 接口,重写 compareTo 方法,比较规则为按照年龄大小升序进行排序,如下代码:Ps:这里升序还是降序,到底是用谁减谁?不用死记,每次用之前自己试一下,试多了自然清楚. 阅读详情

一、总起:两者的作用

首先,两者都是实现排序时的比较功能,比较两个元素,对其进行排序,都需要重写各自的比较方法。

使用 Comparable 必须要修改原有的类,也就是你要排序那个类,就要在那个中实现 Comparable 接口并重写 compareTo 方法,所以 Comparable 更像是“对内”进行排序的接口。​

Comparator 无需修改原有类。也就是在最极端情况下,即使 Person 类是第三方提供的,我们依然可以通过创建新的自定义比较器 Comparator,来实现对第三方类 Person 的排序功能。

也就是说通过 Comparator 接口可以实现和原有类的解耦,在不修改原有类的情况下实现排序功能,所以 Comparator 可以看作是“对外”提供排序的接口。

二、Comparable实现:

2.1、创建一个Person类:

Person类,实现Comparable接口,重写comparaTo方法

package com.bijiao;

/**
 * @program: st
 * @ClassName Person
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 15:58
 * @Version 1.0
 **/

public class Person implements Comparable<Person> {
    private String name;
    private int age;


    //实现Comparable中的comparaTo方法,调用时是升序排序
    @Override
    public int compareTo(Person o) {
        return this.age - o.getAge();
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person() {
    }

    public Person(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;
    }
}

2.2、Test测试类的实现:

package com.bijiao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @program: st
 * @ClassName ComparaTest
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 16:29
 * @Version 1.0
 **/

public class ComparaTest {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("DDD",20));
        persons.add(new Person("BBB",25));
        persons.add(new Person("EEE",24));
        persons.add(new Person("BBB",15));
        persons.add(new Person("CCC",26));

        System.out.println("排序前:");
        for (Person person : persons) {
            System.out.println(person);
        }
        System.out.println("-------------------");
        Collections.sort(persons);
        System.out.println("排序后:");
        for (Person person : persons) {
            System.out.println(person);
        }

    }
}

三、Comparator实现:

3.1、创建Person类:

在使用Comparator接口实现时,由于是在非自己编写的代码或者原有类的代码已经编写好了,不便再对原来的类进行修改,故而在外部创建的类和方法。

package com.bijiaoqi;

/**
 * @program: st
 * @ClassName Person
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 17:11
 * @Version 1.0
 **/

public class Person {
    private String name;
    private int age;
    public Person(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;
    }

    public Person() {
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.2、 实现年龄的升序排列:

package com.bijiaoqi;

import java.util.Comparator;

/**
 * @program: st
 * @ClassName PersonComparator
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 17:16
 * @Version 1.0
 **/

public class AscPersonComparator implements Comparator<Person> {
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
}

3.3、 实现年龄的降序排列:

package com.bijiaoqi;

import java.util.Comparator;

/**
 * @program: st
 * @ClassName 实现降序排列
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 17:30
 * @Version 1.0
 **/

public class DescPersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o2.getAge()-o1.getAge();
    }
}

3.4、创建测试类,对两种排序进行调用查看:

package com.bijiaoqi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @program: st
 * @ClassName ComparaTest
 * @description:
 * @author: 苏芮溪
 * @create: 2024−10-22 17:16
 * @Version 1.0
 **/

public class ComparaTest {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("DDD",20));
        persons.add(new Person("BBB",25));
        persons.add(new Person("EEE",24));
        persons.add(new Person("BBB",15));
        persons.add(new Person("CCC",26));

        System.out.println("排序前:");
        for (Person person : persons) {
            System.out.println(person);
        }
        System.out.println("-------------------");

        Collections.sort(persons, new AscPersonComparator());
        System.out.println("排序后:");
        for (Person person : persons) {
            System.out.println(person);
        }

        System.out.println("======================");
        Collections.sort(persons, new DescPersonComparator());
        System.out.println("排序后:");
        for (Person person : persons) {
            System.out.println(person);
        }
    }
}

四、Comparable与Comparator的总结

Comparable 和 Comparator 都是用来实现元素排序的,它们二者的区别如下:

  • Comparable 是“比较”的意思,而 Comparator 是“比较器”的意思;
  • Comparable 是通过重写 compareTo 方法实现排序的,而 Comparator 是通过重写 compare 方法实现排序的;
  • Comparable 必须由自定义类内部实现排序方法,而 Comparator 是外部定义并实现排序的。

所以用一句话总结二者的区别:Comparable 可以看作是“对内”进行排序接口,而 Comparator 是“对外”进行排序的接口。

MFC停靠窗口实战:CDockablePane从创建到控件布局的完整指南(附残影问题排查) 本文提供了MFC中CDockablePane停靠窗口的完整实战指南,涵盖从自定义窗格类创建、主框架集成、内部控件布局到高级功能定制的全过程。针对开发中常见的“残影”视觉问题,文章深入剖析了其根源,并给出了系统性的排查步骤与解决方案,帮助开发者构建稳定、专业的可停靠用户界面。 阅读详情

相关推荐

设置Solidworks导出文件的坐标系,stl坐标系平移

使用solidworks输出的模型坐标不再原点,怎么平行坐标系,这个方法很简单

weixin_45650767的博客 1万+

Comparator和Comparable的区别

文章目录 一、概述 二、Comparable 三、Comparator 四、Comparator和Comparable的区别 五、实现方式 一、概述   Comparable和Comparator都是两个接口,接口都可以用来实现集合中元素的比较、排序,Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而Comparator既可以嵌入到自身类中,也可以在一个独立的

m0_71087031的博客 1万+

STM32F103移植NuttX实战:从零搭建最小系统到串口Shell(附完整配置文件)

本文详细介绍了在STM32F103C8T6开发板上移植NuttX实时操作系统的完整过程,包括环境搭建、BSP配置、系统时钟初始化、驱动裁剪、编译烧录及串口Shell交互。通过实战指南帮助开发者快速掌握NuttX移植技巧,解决典型问题,适用于嵌入式系统开发。

tree8的博客 293

Comparable和Comparator的用法和区别

comparable是个接口,此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序

weixin_73869209的博客 2615

从仿真曲线到电路状态:用Cadence Virtuoso深度剖析CS放大器各个工作区(以电流源负载为例)

本文通过Cadence Virtuoso平台,深入剖析电流源负载CS放大器在不同工作区的表现,从仿真曲线解读电路状态。详细介绍了如何通过Vout-Vin直流扫描曲线判断MOS管工作区域(截止区、饱和区、线性区),并验证理论与仿真的一致性,提升模拟IC设计调试效率。

weixin_30940783的博客 442

关于Nuttx操作系统

NuttX是一个成熟的实时操作系统

qq_28576837的博客 4092

深入理解Java比较器(Comparable和Comparator)

若一个类实现了Comparable接口,就意味着该类支持排序。实现了 Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。 对于我们想从其他成员变量来排序,那么此时我们就需要比较器来实现。

qq_45830276的博客 5593

汽车BMS技术分享及其HIL测试方案

在全球碳中和目标的战略驱动下,新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏",其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标,更深刻影响着消费者对电动汽车的市场接受度。而电池管理系统(Battery Management System, BMS)是动力电池安全运行与性能释放的核心技术支撑。

Speedgoat的博客 2685

Comparable和Comparator的 区别

一、概述: 对一组数据进行排序(升序或降序),在Java中有很多方式,可以自己手写排序算法(冒泡、快速、二叉树排序等),但一般都采用JDK为我们提供的现有的2个接口,Comparable和Comparator。 二、相同点: 两者都是用来用作对象之间的比较,都可以自定义比较规则。 两者都是返回一个描述对象之间关系的int。 三、区别: Comparable是java.lang包下的,Comparator是java.util包的。 实现Comparable必须重写compareTo(T o),实现Com

FaizOrange的博客 1842

YOLOv11的扩散模型去噪预处理-(在推理前对低质量图像进行增强)

摘要: 扩散模型与YOLOv11的结合有效提升了复杂场景下的目标检测性能。针对低质量图像(如噪声、低光照)导致YOLOv11特征提取退化的问题,研究提出了一种基于条件扩散模型的预处理方法。通过语义引导的渐进式去噪,在保留关键检测特征的同时,显著改善了图像质量。技术核心包括:1)利用YOLOv11浅层特征作为条件输入;2)交叉注意力机制实现任务感知去噪;3)知识蒸馏与潜空间扩散加速推理。实验表明,该方法使mAP50提升19%,在15步内达到传统百步去噪效果,平衡了精度与实时性需求,为鲁棒性目标检测提供了新思路

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 877

史上最牛逼的导航网站(很全很详细)

今天,给大家推荐47个聚合型的导航网站 每一个都收录上百个网站,1个能顶100个,丝毫没有夸张的成分。 (推荐收藏) 设计师导航网站 01 优设导航 https://hao.uisdc.com/ 设计师必备的导航网站,包含设计工具、素材资源、字体设计、配色方案、酷站模板等。 界面清晰无广告,收录网站超过520个。 02 设计导航 http://h...

孙叫兽的博客 7万+

Java中Comparable与Comparator

Java中Comparable与Comparator的区别

m0_46596099的博客 2031

14、微电网控制方法与建模分析

本文详细探讨了微电网的控制方法与建模分析,包括逆变器的小信号状态空间模型、网络模型、负载模型及其组合形成的完整微电网模型。通过对系统特征值和灵敏度因子的分析,揭示了不同模式与系统参数之间的关系。文章还提出了多个研究问题,如岛式系统控制器设计、风力发电控制、并网变换器控制等,为微电网的稳定性分析和优化控制提供了理论支持和实践方向。

elastic6hunter的博客 123

Comparable与Comparator浅析

  今天博主在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparator接口分别进行处理。那么疑问就来了,Comparable和Comparator接口的区别是什么,Java中为什么会存在两个类似的接口?   Comparable和Comparator接口都是用...

朱小厮的博客 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Comparator和Comparable

都是Java中用于对象排序的接口,它们各有优劣,适用于不同的场景。理解它们的区别和使用方法,对于编写清晰、高效的排序代码至关重要。在实际开发中,应根据具体需求选择合适的接口,实现所需的排序逻辑。都是用于排序的接口。它们提供了自定义对象排序的机制,但实现方式和使用场景有所不同。的区别与联系有所帮助。希望以上内容对您理解。

liu_rockefeller的博客 930

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

comparable与comparator

先来说说基本的认识:comparable与comparator两者都是接口,实现的方法都是对对象进行排序。 comparable 这个词是以able结尾的,说明是一种能力,一种属性,可参见Serializable,继承了该接口就可以实现序列化了。那么继承 comparable并且重写compareTo方法,就可以让该类的对象拥有与其他同类对象的比较能力。 这是该...

weixin_39634532的博客 306

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Comparable和Comparator的区别

简述Comparable和Comparator的区别

weixin_55758279的博客 1103

Comparable和Comparator

Java比较器Comparable和Comparator详解 排序原理简介 数组Arrays.sort()排序原理 通过Java API文档知道,Arrays.sort()调用的是DualPivotQuicksort.sort()方法,如下代码片段所示: public static void sort(int[] a) { DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0); } DualPivotQuicksort.s

Gandoph的博客 1171

Comparator与Comparable有什么区别

Comparator与Comparable是Java中实现对象排序的两种接口。Comparable在对象类内部实现,定义自然排序规则;Comparator作为独立比较器,可定义多种排序规则。主要区别在于:Comparable是内部排序(需在类中实现),Comparator是外部排序(可灵活应用于不同类)。选择依据:需要默认排序用Comparable,需要多种或跨类排序用Comparator。

guslegend的博客 697

Comparable与Comparator区别联系

Comparable 和Comparator都是比较接口,实现本接口就可以进行排序。 1.Comparable 在java.lang包中,Comparator位于java.util包中。 2. implements Comparable 需要实现 public abstract int compareTo (T another) Added in API l

Caesardadi的专栏 1159

[java] comparable & comparator

Comparable 和 Comparator 是两个看起来比较相似的两个实现,主要的差别就是 comparable 是和自己比较——同时也实现了自然顺序,comparator 用来比较两个对象也因此,比较常见的使用案例是在 entity 对象上实现 comparable,以及新建一个帮助类去实现 comparator。

GoldenaArcher的博客 609

Java Comparable 与 Comparator 的比较

本文介绍了 Java 中 Comparable 与 Comparator 的比较的相关内容。。。

Regino的博客 286

Comparable与Comparator之比较

1、Comparable接口:需要一个具体的类实现 一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。 这个接口定义在java.lang包下,其源代码如下: [java] view plaincop

Jeff Li 911
上一篇: 业务框架模型(一)
下一篇: equals方法与hashcode方法的重写
SuRuixi
博客等级 码龄5年 293粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值