【Java数据结构】 ---对象的比较

news/2024/9/28 12:42:46/

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

前言

在这里插入图片描述

上图中,线性表、堆、树等等,基本都有增删查改的操作。根据之前的学习,分为大根堆小根堆,而插入数据就需要比较数据否则要插入的数据要插入到哪里去呢?

元素的比较

Java初阶学习过,基本类型的对象可以直接比较大小。

java">int a=10;
int b=20;System.out.println(a > b);
System.out.println(a < b);
System.out.println(a == b);

在这里插入图片描述

运行代码,可直接得出答案。

那么引用类型的对象可以直接比较吗?

java">class Student {public int ID; // 数值public String name; // 花色public Student(int ID, String name) {this.ID = ID;this.name = name;}
}
public class Test {public static void main(String[] args) {Student c1 = new Student(1, "zhang");Student c2 = new Student(2, "wang");Student c3 = c1;//System.out.println(c1 > c2);  // 编译报错System.out.println(c1 == c2);  //System.out.println(c1 < c2);  // 编译报错System.out.println(c1 == c3); }
}

在这里插入图片描述
从运行结果看出来,Java中引用类型的变量不能直接进行比较。

对于我们实现自定义类型(Student),都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址.

但是大多数情况下,我们都是去比较引用变量里面的内容。

java">// Object中equal的实现,可以看到:直接比较的是两个引用变量的地址
public boolean equals(Object obj) {return (this == obj);
}

对象的比较

重写equals

java">@Override
public boolean equals(Object obj) {if(this==obj){return true;} 
}

一般重写equals就是上面演示的。
注意:

  1. 如果传入同一个对象,返回true;
  2. 按照类的实现目标完成比较;
  3. 注意下调用其他引用类型的比较也需要 equals
  4. equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。

基于Comparble接口类的比较

Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:

java">public interface Comparable<E> {int compareTo(E o);
}

在这里插入图片描述

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

java">@Overridepublic int compareTo(Student o) {if (o == null) {return 1;}return ID- o.ID;}public class Test {public static void main(String[] args) {Student c1 = new Student(1, "zhang");Student c2 = new Student(2, "wang");Student c3 = c1;System.out.println(c1.compareTo(c1)); System.out.println(c1.compareTo(c2));   System.out.println(c2.compareTo(c1));   }
}

在这里插入图片描述

基于比较器的比较

用户自定义比较器类,源码实现Comparator接口:

java">public interface Comparator<T> {// 返回值:// < 0: 表示 o1 指向的对象小于 o2 指向的对象// == 0: 表示 o1 指向的对象等于 o2 指向的对象// > 0: 表示 o1 指向的对象等于 o2 指向的对象int compare(T o1, T o2);
}

在这里插入图片描述
重写Comparator中的compare方法:

java">class StudentComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {if (o1 == o2) {return 0;}if (o1 == null) {return -1;}if (o2 == null) {return 1;}return o1.ID - o2.ID;}
public class Test {public static void main(String[] args) {Student c1 = new Student(1, "zhang");Student c2 = new Student(2, "wang");Student c3 = c1;// 定义比较器对象StudentComparator cmptor= new StudentComparator();// 使用比较器对象进行比较System.out.println(cmptor.compare(c1, c1)); System.out.println(cmptor.compare(c1, c2));   System.out.println(cmptor.compare(c2, c1));   }

在这里插入图片描述

三种比较方式的对比

方法说明
Object.equals因为所有类都继承自Object接口,所以直接覆写即可, 只能比较是否相等·
Comparable.compareTo需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于内部顺序
Comparator.compare需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强

总的来说:对于我这样的小白来说,三种方法并没有优劣之分,只要能用,会用就是一个好方法

完结

好了,到这里Java语法部分就已经结束了~
如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散~~Java

下期预告: 【Java数据结构】- - -Java比较


http://www.ppmy.cn/news/1530614.html

相关文章

cisp-pte多少钱考一次?cisp-pte报考费用及报考条件一次说清楚!

CISP-PTE即注册信息安全专业人员-渗透测试工程师&#xff0c;是目前被业界认可的主流专业攻防领域的资质认证&#xff0c;很多小伙伴都在问&#xff1a;CISP-PTE报考条件是什么&#xff1f;cisp-pte报考费用要多少钱&#xff1f;今天一文给大家说清楚&#xff01; 一、CISP-PT…

智能点餐:Spring Boot 技术实现

第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于网上点餐系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、个人中心、用户管理、美食店管理、美食分类管理、美食信息管理、美食订单管理、美食评价管理…

java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能&#xff0c;该如何去实现呢&#xff1f; 1.创建牌类&#xff1a;52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card)&#xff1a;包含大小和花色。 public class Card { //单张牌的大小及类型/…

Linux标准IO(二)-打开、读写、定位文件

1.打开文件fopen 在前面所介绍的文件 I/O 中&#xff0c;使用 open()系统调用打开或创建文件&#xff0c;而在标准 I/O 中&#xff0c;我们将使用库函数fopen()打开或创建文件&#xff0c;fopen()函数原型如下所示&#xff1a; #include <stdio.h>FILE *fopen(const ch…

代码随想录算法训练营第九天|151.翻转字符串里的单词 右旋字符串 28. 实现 strStr()

151.翻转字符串里的单词 给定一个字符串&#xff0c;逐个翻转字符串中的每个单词。 示例 1&#xff1a; 输入: "the sky is blue" 输出: "blue is sky the" 示例 2&#xff1a; 输入: " hello world! " 输出: "world! hello" 解释…

Webpack 5的新特性:Asset Modules与Dynamic Import

文章目录 Asset ModulesAsset Modules 类型配置示例分析 Dynamic Import动态导入语法配置示例分析 实际案例分析Asset Modules 实际案例Dynamic Import 实际案例 性能优化Asset Modules 性能优化Dynamic Import 性能优化 详细代码分析Asset Modules 代码分析Dynamic Import 代码…

mysql root密码重置

以下是如何以正确用户身份启动mysqld的步骤&#xff1a; 停止mysqld服务&#xff08;如果它正在运行&#xff09;&#xff1a; systemctl stop mysqld以mysql用户身份启动mysqld服务&#xff0c;使用--skip-grant-tables和--skip-networking选项&#xff1a; sudo -u mysql …

python新手的五个练习题

代码 # 1. 定义一个变量my_Number,将其设置为你的学号&#xff0c;然后输出到终端。 my_Number "20240001" # 假设你的学号是20240001 print("学号:", my_Number) # 2. 计算并输出到终端:两个数(例如3和5)的和、差、乘积和商。 num1 3 num2 5 print(&…