【对象的比较】java代码实现,详解对象的比较,Comparable接口和Comparator比较器

news2024/9/24 15:28:42

前言:
大家好,我是良辰丫,💞💞💞今天的我们要学习的知识点是java对象的比较,不是大家现实生活中对象的比较,是java中new一个对象的那个对象,对象的比较到底是什么意思呢?我们往下看。⛽⛽⛽

🧑个人主页:良辰针不戳
📖所属专栏:java数据结构
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。


目录

  • 1、基本类型的比较
    • 1.1 简述基本类型进行比较
    • 1.2 为什么对象不能直接比较
  • 2、对象的比较
    • 2.1 equals直接比较对象
    • 2.2 重写equals方法比较对象
    • 2.3 Comparable接口比较对象
    • 2.4 Comparator比较器
  • 3. 三种比较方式对比
    • 3.1 Object.equals
    • 3.2 Comparable.compareTo
    • 3.3 Comparator.compare


1、基本类型的比较

1.1 简述基本类型进行比较

在java中基本类型可以直接比较大小。

public static void main(String[] args) {
        int a = 520;
        int b = 250;
        System.out.println(a > b);
        System.out.println(a < b);
        System.out.println(a == b);
        char c1 = 'A';
        char c2 = 'B';
        System.out.println(c1 > c2);
        System.out.println(c1 < c2);
        System.out.println(c1 == c2);
        boolean b1 = true;
        boolean b2 = false;
        System.out.println(b1 == b2);
        System.out.println(b1 != b2);
    }

在这里插入图片描述

1.2 为什么对象不能直接比较

有人可能会说,那对象也可以进行比较呀,我们看一个简单的例子。

class Stu{
    private String name;
    private int age;
    public Stu(String name,int age){
        this.name = name;
        this.age = age;
    }
}
public class Test10 {
    public static void main(String[] args) {
        Stu stu1 = new Stu("张三",18);
        Stu stu2 = new Stu("张三",18);
        System.out.println(stu1 == stu2);
    }
  }

在这里插入图片描述

我们new了两个对象,但是我们在在这两个对象中想表示的是同一个人,然而呢,进行表示的时候却打印出了false,why?why?why?谁能告诉我怎么回事呢?原来呀,直接比较镀锡,比较的是对象的地址,new了两块空间,当然会打印false。那么我们如何真正的对对象进行比较呢?先喝一口茶压压惊☕☕☕,然后慢慢往下看。

2、对象的比较

2.1 equals直接比较对象

java中的equals方法只能比较对象是否相同,如果你不给它制定规则,它默认调用的是Objects的方法。

 public static void main(String[] args) {
        Stu stu1 = new Stu("张三",18);
        Stu stu2 = new Stu("张三",18);
        System.out.println(stu1.equals(stu2));
    }

在这里插入图片描述

上面直接调用equals方法,还是打印的false,那么我们需要给它制定比较规则,如何做呢?我们慢慢往下看。

2.2 重写equals方法比较对象

class Stu{
    private String name;
    private int age;
    public Stu(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Stu stu = (Stu) o;
        return age == stu.age && Objects.equals(name, stu.name);
    }

   
}
public class Test10 {
    public static void main(String[] args) {
        Stu stu1 = new Stu("张三",18);
        Stu stu2 = new Stu("张三",18);
        System.out.println(stu1 == stu2);
    }
  }

在这里插入图片描述

此时,奇迹发生了,打印出来的是true,因为我们给它制定了一个比较规则,重写了equals方法,只要比较对象里的姓名和年龄都相同的时候就返回true,否则,返回false。

2.3 Comparable接口比较对象

对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类中重写compareTo方法。

class Stu implements Comparable<Stu>{
    private String name;
    private int age;
    public Stu(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Stu o) {
        return this.age - o.age;
    }
   }
  public class Test10 {
    public static void main(String[] args) {
        Stu stu1 = new Stu("张三",18);
        Stu stu2 = new Stu("张三",18);
        System.out.println(stu1.compareTo(stu2));
    }
   }

在这里插入图片描述

那么问题又来了,如果一个对象有很多属性,我想根据某个属性进行比较,比如年龄或者性别,难道一个个修改比较规则嘛,这样我们又引入了一种比较容器,Comparator比较器。

2.4 Comparator比较器

  • 用户自定义比较器类,实现Comparator接口
  • 重写Comparator中的compare方法
import java.util.Comparator;
class Stu implements Comparable<Stu>{
    public String name;
    public int age;
    public Stu(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Stu o) {

        return this.age - o.age;
    }

}
class AgeComparator implements Comparator<Stu> {

    @Override
    public int compare(Stu o1, Stu o2) {
        return o2.age - o1.age;
    }
}
class NameComparator implements Comparator<Stu> {

    @Override
    public int compare(Stu o1, Stu o2) {
        return o2.name - o1.name;
    }
}
public class Test10 {
    public static void main(String[] args) {
        Stu stu1 = new Stu("张三",18);
        Stu stu2 = new Stu("张三",18);
        AgeComparator ageComparator = new AgeComparator();
        System.out.println(ageComparator.compare(stu1,stu2));
    }

}

看了上面两种比较方式,是不是感觉很乱,第一次接触就是这样,多去感悟,多去理解,慢慢就熟悉了,为了让大家更熟悉,简单去总结一下。

3. 三种比较方式对比

3.1 Object.equals

因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等。

  • equals的返回值为布尔类型,重写后也是只能去根据某个属性判断是否相等。
  • 重写后太死板,只能比较是否相等。

3.2 Comparable.compareTo

需要手动去实现接口,实现接口后,每次用该类,都有顺序,属于内部顺序。

  • 类需要实现Comparable接口。
  • 实现接口后,返回值为int,可以比较大小。
  • 不灵活,指定根据某个属性比较,那么要想根据别的属性进行比较,还得重新修改比较的属性。

3.3 Comparator.compare

需要实现一个类比较器,对待比较类的侵入性弱,但对算法代码实现侵入性
强。

  • 需要创建一个类实现该比较器。
  • 可以灵活比较各个属性(定义各个类去实现该比较器)。
  • 代码比较多。

后序:
看到这里,大家对Comparable接口比较和Comparator类比较器有了一定的认识,大家多去学习,去品味,后面好多知识点需要通过这两种比较方式。希望我的文章能给大家带来帮助,我们一起加油!!!🍎🍎🍎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

24.网络编程(二)

目录 三.TCP通信 3.1 TCP协议特点 3.2 TCP协议通信场景 3.3 TCP通信模型演示 3.4 Socket 3.5 ServerSocket 3.6 注意事项 3.7 案例 3.7.1 TCP通信—单发单收 3.7.2 TCP通信—多发多收 3.7.3 TCP通信—同时接收多个客户端的消息。 3.7.4 TCP通信—使用线程池优化&am…

工业相机和镜头

工业相机和镜头镜头型号数据电源接口定焦镜头的调焦景深景深大小光圈相机、镜头选取参考镜头型号、数据电源接口、定焦镜头的调焦、景深、景深大小、光圈、相机、镜头选取 镜头型号 C&#xff0c;CS系列&#xff1a;相机镜头的C、CS接口非常相似&#xff0c;它们的接口直径、螺…

检索业务:基本数据渲染和排错

采用标签显示商品的数据 <div class"rig_tab"><div th:each"product:${result.getProducts()}"><div class"ico"><i class"iconfont icon-weiguanzhu"></i><a href"/static/search/#">…

5、数据的重构

目录 一、为什么进行数据重构 二、如何进行数据重构 一、为什么进行数据重构 进行数据分析时&#xff0c;有可能会发现数据的结构并不适合直接进行数据分析操作&#xff0c;如下面数据&#xff0c;但通过复制-粘贴-转置等方法操作又太繁琐&#xff0c;数据量小还行&#xff…

C++ 图进阶系列之 kruskal 和 Prim 算法_图向最小生成树的华丽转身

1. 前言 树和图形状相似&#xff0c;也有差异性。树中添加一条或多条边&#xff0c;可成图。图中减小一条或多条边&#xff0c;可成树。形态的变化由数据之间的逻辑关系决定。 图用来描述数据之间多对多关系。树用来描述数据之间一对多关系。 思考如下问题&#xff1f; 如果…

esp32 烧录协议

esp32的rom固化了出场固件。进入烧录模式后&#xff0c;esp32串口输出&#xff1a;给esp32烧录固件的时候&#xff0c;需要和rom的bootloder进行通讯。通讯时&#xff0c;使用 SLIP 数据包帧进行双向数据传输。每个 SLIP 数据包都以 0xC0 开始和结束。 在数据包中&#xff0c;所…

9、Servlet——Request对象

目录 一、get请求和post请求的区别 二、Request对象的应用 1、request主要方法 2、request获取数据 3、设置请求的编码格式 三、解决get请求收参乱码问题 四、解决post请求中文乱码问题 一、get请求和post请求的区别 在Servlet中用来处理客户端请求需要用doGet()方法或…

openGauss数据库源码解析系列文章——备份恢复机制:openGauss全量备份技术

目录 10.1 openGauss全量备份技术 10.1.1 gs_basebackup备份工具 10.1.2 gs_basebackup备份交互流程 本文主要介绍openGauss的备份恢复原理和技术。备份恢复是数据库日常维护的一个例行活动&#xff0c;通过把数据库数据备份到另外一个地方&#xff0c;可以抵御介质类的损…

数据结构与算法-稀疏数组

Java高级系列文章前言 本文章涉及到数据结构与算法的知识&#xff0c;该知识属于Java高级阶段&#xff0c;通常为学习的二阶段&#xff0c;本系列文章涉及到的内容如下&#xff08;橙色框选内容&#xff09;&#xff1a; 本文章核心是教学视频&#xff0c;所以属于个人笔记&a…

深度卷积对抗神经网络 基础 第六部分 缺点和偏见 GANs Disadvantages and Bias

深度卷积对抗神经网络 基础 第六部分 缺点和偏见 GANs Disadvantages and Bias GANs 综合评估 生成对抗网络&#xff08;英语&#xff1a;Generative Adversarial Network&#xff0c;简称GAN&#xff09;是非监督式学习的一种方法&#xff0c;透过两个神经网络相互博弈的方式…

实体对齐(三):RNM

一.摘要 实体对齐旨在将来自不同知识图&#xff08;KG&#xff09;的具有相同含义的实体联系起来&#xff0c;这是知识融合的重要步骤。 现有研究侧重于通过利用知识图谱的结构信息学习实体嵌入来进行实体对齐。这些方法可以聚合来自相邻节点的信息&#xff0c;但也可能带来来…

从软件开发角度看待PCI和PCIe

从软件开发角度看待PCI和PCIe 文章目录从软件开发角度看待PCI和PCIe参考资料&#xff1a;一、 最容易访问的设备是什么二、 地址空间的概念三、 理解PCI和PCIE的关键3.1 地址空间转换3.2 PCI接口速览3.3 PCIe接口速览四、 访问PCI/PCIe设备的流程4.1 PCI/PCIe设备的配置信息4.2…

特斯拉2022全年财报摘要

重点一览一、盈利方面 2022全年营业利润率为16.8%&#xff0c;其中第四季度为16.0% 2022全年GAAP营业利润为137亿美元&#xff0c;其中第四季度为39亿美元 2022全年GAAP净利润为126亿美元&#xff0c;其中第四季度为37亿美元 2022全年非GAAP净利润为141亿美元&#xff0c;其中…

MySQL中的多表联合查询

目录 一.介绍 数据准备 交叉连接查询 内连接查询 外连接 子查询 特点 子查询关键字 all关键字 any关键字和some关键字 in关键字 exists关键字 自关联查询 总结 一.介绍 多表查询就是同时查询两个或两个以上的表&#xff0c;因为有的时候用户在查看数据的时候,需要…

四足机器人发展史及机器人盘点

四足机器人发展史及机器人盘点 本文翻译整理自文章 四足行走机器人发展综述 20世纪初前后 1870 CHebyshev(沙俄)发明了第一个行走机构, 将旋转运动转换为匀速平动运动. - 由于连接机构形似希腊字母λ, 该连杆命名为λ机构. - 可在平面运动, 没有独立的腿部运动 - Rygg(美国…

windows下nodejs下载及环境变量配置,运行vue项目

文章目录1.下载安装node.js2.环境变量配置&#xff08;重点&#xff09;3.切换镜像源切换yarn作为主力命令1.下载安装node.js 1.https://registry.npmmirror.com/binary.html 搜索node&#xff0c;下载对应的版本&#xff0c;安装即可。一路next&#xff0c;路径选择自己想放置…

与string容易混淆的类——StringBuilder

目录 StringBuilder类概述及其构造方法 StringBuilder类的常用方法 StringBuilder类练习 StringBuilder类概述及其构造方法 StringBuilder类概述–我们如果对字符串进行拼接操作&#xff0c;每次拼接&#xff0c;都会构建一个新的String对象&#xff0c;既耗时&#xff0c;…

verilog图像算法实现与仿真(流程和实现)

【声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们谈到了fpga&#xff0c;谈到了用pythoncv2实现图像算法&#xff0c;直到现在才算是慢慢进入了正题。毕竟用verilog实现图像算法&#xff0c…

HalfEdge半边数据结构详解

我们可以将离散表面表示为多边形网格。 多边形网格可以被认为是图&#xff08;具有顶点和顶点之间的边&#xff09;加上面列表&#xff0c;其中面是边的环。 推荐&#xff1a; 使用 NSDT场景设计器 快速搭建 3D场景。 下面&#xff0c;我们将网格指定为顶点列表和面列表&#…

【博学谷学习记录】大数据课程-学习第四周总结

分布式技术 为什么需要分布式 计算问题 无论是我们在学校刚开始学编程&#xff0c;还是在刚参加工作开始处理实际问题&#xff0c;写出来的程序都是很简单的。因为面对的问题很简单。以处理数据为例&#xff0c;可能只是把一个几十K的文件解析下&#xff0c;然后生成一个词频…