【对象的比较】java代码实现,详解对象的比较,Comparable接口和Comparator比较器
创始人
2024-05-21 08:21:23
0

前言:
大家好,我是良辰丫,💞💞💞今天的我们要学习的知识点是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;}@Overridepublic 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{private String name;private int age;public Stu(String name,int age){this.name = name;this.age = age;}@Overridepublic 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{public String name;public int age;public Stu(String name,int age){this.name = name;this.age = age;}@Overridepublic int compareTo(Stu o) {return this.age - o.age;}}
class AgeComparator implements Comparator {@Overridepublic int compare(Stu o1, Stu o2) {return o2.age - o1.age;}
}
class NameComparator implements Comparator {@Overridepublic 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类比较器有了一定的认识,大家多去学习,去品味,后面好多知识点需要通过这两种比较方式。希望我的文章能给大家带来帮助,我们一起加油!!!🍎🍎🍎

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...