Java 中Comparable和Comparator区别比较

Java排序与比较:Comparable与Comparator的区别与实践 本文深入探讨了Java中的对象比较和排序机制,详细解释了Comparable和Comparator接口的不同用法、优势与局限性。通过具体实例,展示了如何利用这两个接口对Java对象进行排序,以及如何处理排序中可能遇到的问题,如空值的处理和多字段排序。同时,本文也提供了一些Java 8中引入的新方法,如Comparator的默认方法和方法引用,它们能够简化比较器的创建和使用。 阅读详情

Comparable 是排序接口:

          若一个类实现了Comparable接口,就意味着“该类支持排序”。  即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
         此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。例如TreeSet<Person> set = new TreeSet<Person>(new Compara());其中Compara是实现Comparable接口的类。

         此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。

     强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。注释应当加上:“注意:此类具有与 equals 不一致的自然排序。

Comparator 是比较器接口:

         我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
         也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

说明:
(1) 若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。
(2) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。


Comparator 和 Comparable 比较

1. Comparable是排序接口:若一个类实现了Comparable接口,就意味着“该类支持排序”。
2. Comparator是比较器:我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
3. Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

例子: comparator

public class Person {

    int id;

    String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class SortComparator {

    class PersonCompara implements Comparator<Person> {

        @Override
        public int compare(Person o1, Person o2) {
            if (o1.getId() == o2.getId()) {
                return 0;
            } else if (o1.getId() > o2.getId()) {
                return 1;
            } else {
                return -1;
            }
        }
    }

    public static void main(String[] args) {
        List<Person> personList = new ArrayList<Person>();
        Person person1 = new Person();
        person1.setId(1);
        person1.setName("name1");
        personList.add(person1);
        Person person2 = new Person();
        person2.setId(2);
        person2.setName("name2");
        personList.add(person2);
        Person person3 = new Person();
        person3.setId(3);
        person3.setName("name3");
        personList.add(person3);
        Collections.sort(personList, new SortComparator().new PersonCompara());
    }
}

例子二:compareable

public class PersonWithCompare implements Comparable<PersonWithCompare> {

    int id;

    String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(PersonWithCompare o) {
        if (id == o.getId()) {
            return 0;
        } else if (id > o.getId()) {
            return 1;
        } else {
            return -1;
        }
    }
}

public class SortComparable {

    public static void main(String[] args) {
        List<PersonWithCompare> personList = new ArrayList<PersonWithCompare>();
        PersonWithCompare person1 = new PersonWithCompare();
        person1.setId(1);
        person1.setName("name1");
        personList.add(person1);
        PersonWithCompare person2 = new PersonWithCompare();
        person2.setId(2);
        person2.setName("name2");
        personList.add(person2);
        PersonWithCompare person3 = new PersonWithCompare();
        person3.setId(3);
        person3.setName("name3");
        personList.add(person3);
        Collections.sort(personList);
    }
}


参考链接:http://www.jb51.net/article/41730.htm

subuser, 在有选择性限制权限的linux上,运行程序.zip subuser, 在有选择性限制权限的linux上,运行程序 Subuser - 使用 Docker 保护Linux桌面 在 subuser.org 访问我们。作为自由软件开发者,我们愿意分享。 我们上网发现新的代码。 我们希望尝试一下。 我们出现了一个爱和信任,unafraid的某些代码 立即下载

相关推荐

IC版图设计之OASIS文件格式详解

OASIS(Open Artwork System Interchange Standard)是继GDSII之后新一代的集成电路版图数据交换标准,由SEMI在2004年正式发布(SEMI标准号:SEMI P39)。高压缩率:相比GDSII可减少3-10倍文件体积扩展性强:支持纳米级工艺的复杂图形描述跨平台兼容:独立于EDA工具和操作系统安全增强:内置校验和与加密支持。

ZZcppc的博客 2440

反射之访问属性

前面介绍了获取Class实例的三个方法,现在来介绍根据Class实例访问其属性 新建一个springboot项目,名称为reflection,该项目继承了一个父项目springboot-parent,后续的有关文章都是在这个项目上进行开发,父项目只是定义了依赖,我就不粘贴出来了,不懂的可以去看看maven的拆分聚合 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/P

Fandy的博客 346

一觉醒后ChatGPT 被淘汰了

近日,AI 界貌似出现了一种新的趋势:自主人工智能。这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归 OpenAI 的 Andrej Karpathy 也为其大力宣传,并在推特赞扬:「AutoGPT 是 prompt 工程的下一个前沿。」

Rocky006的博客 13万+

从SO-100到SO-101:开源机器人手臂的三次设计革命与社区进化

在开源硬件领域,每一次成功的迭代都不仅仅是技术参数的提升,更是设计哲学与社区协作模式的进化。Standard Open Arm(SO-ARM)项目从初代SO-100到最新SO-101的蜕变,完美诠释了如何通过模块化设计、用户反馈驱动和生态构建,将一个专业的机器人手臂项目变成人人可及的DIY平台。这个开源机器人手臂项目不仅降低了3D打印机器人的入门门槛,更构建了一个可持续的硬件生态系统。 ## 问

gitblog_00537的博客 1016

RK3588S开发板实战:手把手教你搞定IMX415摄像头驱动配置(附调试日志分析)

本文提供了一份详细的RK3588S开发板配置IMX415摄像头驱动的实战指南。内容涵盖从环境准备、内核驱动编译、设备树节点编写到调试日志分析的完整流程,并重点解析了摄像头调试过程中的常见问题与解决方案,帮助开发者快速完成驱动配置与功能验证。

weixin_28285943的博客 204

AI安全攻防:十六进制编码与表情符号如何绕过ChatGPT安全限制

在人工智能安全领域,提示词工程是影响大语言模型行为的关键技术。其核心原理在于通过精心设计的输入文本,引导模型生成特定内容或执行特定任务。这项技术的价值在于能够深入探究模型的理解机制与决策边界,对于模型优化、安全测试及功能开发具有重要意义。在实际应用场景中,研究人员常利用编码转换、符号插入等方法构造输入,以测试模型安全护栏的鲁棒性。近期,一种结合十六进制编码与表情符号的组合攻击手法受到关注,该方法通过信息伪装与语义干扰,试图绕过模型内置的内容过滤机制,这凸显了当前AI安全在输入预处理与语义理解协同防御上面临的

weixin_30633405的博客 447

3个实战技巧让您的React Native Firebase集成更高效:从零到生产部署指南

在移动应用开发的世界里,Firebase无疑是Google为开发者准备的一站式后端解决方案宝库。然而,当React Native遇上Firebase时,跨平台兼容性和原生模块集成的复杂性常常让开发者望而却步。React Native Firebase的出现,就像是为React Native开发者量身定制的桥梁,让我们能够轻松地在iOS和Android平台上使用Firebase的所有强大功能。 #

gitblog_00027的博客 662

Ceph RGW对象存储

Ceph RGW对象存储

sqlora的专栏 1958

想学嵌入式但没开发板?试试这个免费的STM32虚拟仿真平台(含LVGL界面教程)

本文介绍如何利用免费的STM32虚拟仿真平台学习嵌入式开发,特别适合预算有限或零硬件基础的学习者。通过详细的LVGL界面开发教程,展示虚拟仿真在嵌入式学习中的高效性和实用性,涵盖环境搭建、代码实现到实机迁移的全流程,助力快速掌握嵌入式开发核心技能。

weixin_29266647的博客 306

MATLAB计算各种复合干热指数,如SDHI、DHMI等

MATLAB编程实现各种复合干热指数

WW、forever的博客 5079

java中Comparable和Comparator的用法和区别 Comparable自然排序 Comparator比较器排序

java中Comparable和Comparator的用法和区别 Comparable自然排序 Comparator比较器排序 一、概述 Comparable和Comparator在java中都是用于来比较数据大小。实现Comparable接口需要重写compareTo方法,实现Comparator方法需要重写compare方法。 这两个方法返回值都是int类型,根据返回值来判断比较对象...

HaHa_Sir的博客 2500

Android 13 灭屏音乐播放问题解决与优化建议

通过在中增加对音乐播放状态的检测,我们成功解决了客户应用在灭屏状态下音乐播放被中断的问题。

m0_60898338的博客 1157

java中Comparable和Comparator两种比较器的区别

java中Comparable和Comparator两种比较器的区别 comparable接口:提供了一个compareTo()方法,用来比较两个对象的大小,他定义在集合内部,从而实现排序 comparator接口:提供了一个compare()方法,定义在 集合的外部,当要实现排序方法,需要在connections的sort方法中加入一个实现comparator接口的比较器参数 代码实现 comparable //简单封装了一个类,用作比较大小 public class People implements

SupperNova的博客 380

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java 两个比较器 Comparable 和 Comparator 的区别

1 前言 在我们自定义的数据结构需要排序时,需要一定的排序规则,这就需要用到今天我们介绍的两个比较器 Comparable 和 Comparator。 2 Comparable Comparable 位于 java.lang 包下,本质上是一个内比较器,实现了 Comparable 的类可以自己比较,至于比较的结果如何则需要依赖于自然比较方法 compareTo 的实现。 compareTo 的返...

Geffin的博客 607

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java比较器Comparable接口和Comparator接口之间区别

java的比较器有两类,分别是Comparable接口和Comparator接口。在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口。让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用或者Collections.sort来排序对象数组,实例如下:import java.io.Serial...

随风而来的温柔 756

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

1、Comparable和Comparator介绍 在java中Intege,Double等基本数据类型和Sting都实现了Comparable接口,不用我们在自己去实现。对于类的比较,需要我们定义比较用到的字段比较逻辑。Comparable是内部比较器需要在类内部实现,Comparator是外部比较器生成比较器对象。 2、使用 (1)类实现Comparable接口重写comparato方法和传的参数进行对比 public class Persion implements Comparable&lt

weixin_44847077的博客 174

java中comparable比较_Java 中Comparable和Comparator区别比较

Comparable 简介Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。此外,“实现Comparable接口...

weixin_32208021的博客 125

【Java基础】Comparable和Comparator两种比较器的区别(原理+实现)

一、概述   Comparable和Comparator都是两个接口,接口都可以用来实现集合中元素的比较、排序,Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而Comparator既可以嵌入到自身类中,也可以在一个独立的类中实现比较。 Integer、String等这些基本类型的JAVA封装类都已经实现了Comparable接口,这些类对象本身就支持自比较,直接调用Collections.sort()就可以对

时光、疏离了记忆づ童话的博客 1890

比较java comparable和Comparator 区别

比较java comparable和Comparator 区别 Comparable & Comparator 都是用来实现集合中的排序的,只是 Comparable 是在集合内部定义的方法实现的排序, Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。 Comparab

Stroller 676

java 比较接口_Java 比较接口comparable与comparator区别解析

这篇文章主要介绍了Java 比较接口comparable与comparator区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下package test0;import java.util.Comparator;//限定修饰符为friend不能为public,一个java文件中只能有一个public类/**** java程序是从一个publi...

weixin_28949355的博客 157

Java中的比较器Comparable和Comparator的区别与作用

今天在看TreeMap的时候总是出现关于比较的问题,刚开始对Comparable和Comparator不是很理解,想着这两个都是差不多的比较器,但是随着看着的深入发现不仅仅只是比较的作用,还可以用来排序的作用。首先看看使用两个比较器所需要的函数:Comparable:使用Comparable一般都是通过类去实现此接口的,在类的内部去实现这个方法,所以一般人也称作为内部比较器(相对于Comparat...

谈恋爱 697

JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)

文章目录一、什么是Comparator二、Java compare方法和compareTo方法三、java中Comparable和Comparator的区别Comparator的例子三、demo:java8使用Lambda表达式比较器Comparator给List对象排序,按时间、数字、字典排序 一、什么是Comparator Comparator 是javase中的接口,位于java.util包下。 数组工具类和集合工具类中提供的工具方法sort方法都给出了含有Comparator接口的重载方法。 Arr

西京刀客 5215

java 比较器不同维度间的比较_java中Comparable和Comparator两种比较器的区别

Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器,基本的写法如下:class Apple implements Comparable{int id;double p...

weixin_42594427的博客 307
上一篇: 动态代理内部实现
下一篇: js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
subuser
博客等级 码龄19年 31粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值