《深入理解 == 与 equals ():Java 中对象比较的奥秘》

目录

一、== 运算符

1. 使用范围

2. 比较规则

二、equals() 方法

1. 使用范围

2. 具体使用及重写与否的区别

三、总结


一、== 运算符

1. 使用范围

== 运算符的使用范围非常广泛,它既可以用于基本数据类型,也可以用于引用数据类型。

2. 比较规则

  • 基本数据类型:当 == 用于比较基本数据类型时,它的作用是判断两个数据值是否相等。例如,比较两个整数、两个浮点数、两个字符等的数值是否相同。

下面是一个简单的示例:

int num1 = 5;
int num2 = 5;
System.out.println(num1 == num2); // 输出:true,因为num1和num2的值都是5
  • 引用数据类型:当 == 用于引用数据类型时,它比较的是两个引用变量的地址值是否相等。也就是说,它在判断两个对象是否指向了堆空间中的同一个对象实体。

考虑以下示例

class Person {private String name;public Person(String name) {this.name = name;}
}Person person1 = new Person("Alice");
Person person2 = new Person("Alice");
Person person3 = person1;System.out.println(person1 == person2); // 输出:false,person1和person2指向不同的对象实体
System.out.println(person1 == person3); // 输出:true,person3和person1指向同一个对象实体

在上述代码中,虽然 person1 和 person2 的 name 属性值相同,但它们是通过 new 关键字分别创建的两个不同的对象,所以 == 比较的结果为 false。而 person3 直接指向了 person1 所指向的对象,所以 person1 和 person3 用 == 比较时结果为 true

二、equals() 方法

1. 使用范围

equals() 方法只能使用在引用数据类型上。

2. 具体使用及重写与否的区别

  • 未重写 equals() 方法(默认情况):对于自定义的类,如果没有重写 Object 类中声明的 equals() 方法,那么调用该方法时,实际上就是在比较两个对象的引用地址是否相同。(或比较两个对象是否指向了堆空间中的同一个对象实体)。

以下是一个示例来说明未重写 equals() 方法时的情况:

class Book {private String title;private String author;public Book(String title, String author) {this.title = title;this.author = author;}
}Book book1 = new Book("Java核心技术", "Cay Horstmann");
Book book2 = new Book("Java核心技术", "Cay Horstmann");System.out.println(book1.equals(book2)); // 输出:false,因为没有重写equals()方法,比较的是引用地址

在这个例子中,book1 和 book2 虽然具有相同的书名和作者,但由于 Book 类没有重写 equals() 方法,所以 equals() 比较的结果是 false,因为它们指向不同的对象实体。

  • 重写 equals() 方法:在实际开发中,针对于自定义的类,常常会判断两个对象是否 equals(),而此时主要是判断两个对象的属性值是否相等。所以我们通常要重写 Object 类中的 equals() 方法。

下面是重写 equals() 方法后的 Book 类示例:

class Book {private String title;private String author;public Book(String title, String author) {this.title = title;this.author = author;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass()!= o.getClass()) return false;Book book = (Book) o;return Objects.equals(title, book.title) && Objects.equals(author, book.author);}
}Book book1 = new Book("Java核心技术", "Cay Horstmann");
Book book2 = new Book("Java核心技术", "Cay Horstmann");System.out.println(book1.equals(book2)); // 输出:true,因为重写了equals()方法,比较的是属性值

在上述重写后的代码中,我们首先判断传入的对象是否就是当前对象(通过 if (this == o) return true;),然后判断传入对象是否为 null 或者是否属于同一类(通过 if (o == null || getClass()!= o.getClass()) return false;)。如果都满足,就将传入对象强制转换为 Book 类(因为我们知道它是同一类了),最后比较两个对象的属性值是否相等(通过 Objects.equals(title, book.title) && Objects.equals(author, book.author))。这样,当我们比较 book1 和 book2 时,就会根据它们的属性值来判断是否相等,结果为 true

对于 StringFileData 和包装类等,它们都已经重写了 Object 类中的 equals() 方法,用于比较两个对象的实体内容是否相等。例如:

String str1 = "Hello";
String str2 = "Hello";System.out.println(str1.equals(str2)); // 输出:true,因为String类重写了equals()方法,比较的是字符串内容

三、总结

通过以上的分析和示例,我们可以清晰地看到 == 运算符和 equals() 方法在对象比较中的不同作用。== 主要用于判断基本数据类型的值是否相等以及引用数据类型的引用地址是否相等;而 equals() 方法在未重写时也比较引用地址,但在重写后通常用于比较自定义类的对象属性值是否相等。在实际开发中,我们要根据具体需求正确使用这两种比较方式,特别是对于自定义类,要根据是否需要比较属性值来决定是否重写 equals() 方法。希望这篇博客能够帮助大家更好地理解和掌握 == 与 equals() 的区别,在编程和面试中都能应对自如。

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

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

相关文章

【stm32】RTC时钟的介绍与使用

RTC时钟的介绍与使用 一、时间戳1、Unix时间戳2、UTC/GMT3、时间戳转换 二、BKP简介及代码编写1、BKP简介2、BKP基本结构3、BKP库函数介绍:4、程序编写: 三、RTC简介及代码编写1、RTC简介2、RTC框图2、RTC基本结构3、RTC相关库函数介绍:4、程…

界面控件DevExpress JS ASP.NET Core v24.1亮点 - 支持Angular 18

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

如何检索 LINEMOD 数据集的相机内参

简介 BOP (Benchmark for 6D Object Pose Estimation) 是一个专为6D物体姿态估计而设计的基准测试平台。它为研究人员提供了多种数据集,以帮助评估和比较物体识别和姿态估计算法的性能。官方网站是 BOP,你可以在这里找到丰富的资源和信息。 检索 LINEM…

机器学习与数据挖掘_使用梯度下降法训练线性回归模型

目录 实验内容 实验步骤 1. 导入必要的库 2. 加载数据并绘制散点图 3. 设置模型的超参数 4. 实现梯度下降算法 5. 打印训练后的参数和损失值 6. 绘制损失函数随迭代次数的变化图 7. 绘制线性回归拟合曲线 8. 基于训练好的模型进行新样本预测 实验代码 实验结果 实验…

web——sqliabs靶场——第一关

今天开始搞这个靶场,从小白开始一点点学习,加油!!!! 1.搭建靶场 注意点:1.php的版本问题,要用老版本 2.小p要先改数据库的密码,否则一直显示链接不上数据库 2.第一道题&#xff0…

Xamarin 实现播放视频 MP4

我的想法是在App启动时播放一段视频,实现方式如下: 准备一个视频: Logo.mp4 添加到资源中:Assets 然后将资源设置为 AndroidAsset 启动时,将资源文件拷贝到程序目录的files下: protected override void On…

4070显卡只要一毛钱?这个双十一太疯狂了

2024年双十一大战正酣,各大商家使尽浑身解数,奇招频出,真是让人看得目瞪口呆。每日口令红包、攒火力值领裂变红包、限时抢免定金红包……还有各类满减和打折优惠活动,玩法千奇百怪,算来算去索性放弃,真是没…

C++优选算法四 前缀和

前缀和算法是一种常用的优化技术,主要用于加速某些涉及连续子数组或子序列求和的问题。 一、定义与原理 定义:前缀和是指数组中某个位置之前(包括该位置)所有元素的和。前缀和算法则是通过提前计算并存储这些前缀和,…

yum安装指定版本Redis

一,yum安装Redis 1,列出可用的redis版本 yum --showduplicates list redis 只有5.0.3.5版本,如果已经满足需求,可以直接安装 2,安装redis yum -y install 如果显示installed, 说明安装成功了 也可以通过…

DAY21|二叉树Part08|LeetCode: 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 LeetCode: 669. 修剪二叉搜索树 基本思路 C代码 LeetCode: 108.将有序数组转换为二叉搜索树 基本思路 C代码 LeetCode: 538.把二叉搜索树转换为累加树 基本思路 C代码 LeetCode: 669. 修剪二叉搜索树 力扣代码链接 文字讲解:LeetCode: 669. 修剪二叉搜…

HarmonyOS基础:鸿蒙系统组件导航Navigation

大家好!我是黑臂麒麟(起名原因:一个出生全右臂自带纹身的高质量程序员😏),也是一位6(约2个半坤年)的前端; 学习如像练武功一样,理论和实践要相结合&#xff0…

​Houdini云渲染如何使用?如何让一个镜头使用成百上千台机器渲染,提高渲染效率

​Houdini云渲染如何使用?如何让一个镜头使用成百上千台机器渲染,提高渲染效率呢,最简单的教程来了! 第一步:云渲码6666注册成都渲染101,并且下载渲染101客户端 客户端是上传下载的工具,将文件…

如何使用Varjo直接观看Blender内容

最近,开源的3D建模程序Blender为Varjo提供了出色的OpenXR支持,包括四视图和凹进渲染扩展。但是在Blender中,默认不启用VR场景检查。要开始使用VR场景检查,只需遵循以下步骤: 1. 下载并安装Blender 2.启用Blender VR场景…

linux 安装anaconda3

1.下载 使用repo镜像网址下载对应安装包 右击获取下载地址,使用终端下载 wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh2.安装 使用以下命令可直接指定位置 bash Anaconda3-2024.02-1-Linux-x86_64.sh -b -p /home/anaconda3也…

JavaScript。—关于语法基础的理解—

一、程序控制语句 JavaScript 提供了 if 、if else 和 switch 3种条件语句&#xff0c;条件语句也可以嵌套。 &#xff08;一&#xff09;、条件语句 1、单向判断 &#xff1a; if... &#xff08;1&#xff09;概述 < if >元素用于在判断该语句是否满足特定条…

DDD学习笔记

DDD学习笔记 1. 什么是 DDD&#xff1f; 领域驱动设计&#xff08;Domain-Driven Design, DDD&#xff09;是一种复杂软件系统设计的方法&#xff0c;强调以业务领域为核心进行设计与开发。它通过将业务逻辑与代码组织紧密结合&#xff0c;帮助开发团队更好地理解和实现业务需…

c语言简单编程练习8

1、递归函数&#xff1a; 通过调用自身来解决问题的函数&#xff0c;递归也就是传递和回归&#xff1b; 递归函数的两个条件&#xff1a; 1&#xff09;函数调用函数本身 2&#xff09;一定要有结束条件 循环与递归的区别&#xff1a; 每调用一次递归函数&#xff0c;都会…

如何将MySQL彻底卸载干净

目录 背景&#xff1a; MySQL的卸载 步骤1&#xff1a;停止MySQL服务 步骤2&#xff1a;软件的卸载 步骤3&#xff1a;残余文件的清理 步骤4&#xff1a;清理注册表 步骤五:删除环境变量配置 总结&#xff1a; 背景&#xff1a; MySQL卸载不彻底往往会导致重新安装失败…

linux-环境变量

环境变量是系统提供的一组 name value 的变量&#xff0c;不同的变量有不同的用途&#xff0c;通常都具有全局属性 env 查看环境变量 PATH PATH是一个保存着系统指令路径的一个环境变量&#xff0c;系统提供的指令不需要路径&#xff0c;直接就可以使用就是因为指令的路径…

IDEA修改生成jar包名字的两种方法实现

IDEA修改生成jar包名字的两种方法实现 更新时间&#xff1a;2023年08月18日 11:45:36 作者&#xff1a;白白白鲤鱼 本文主要介绍了IDEA修改生成jar包名字的两种方法实现,通过简单的步骤,您可以修改项目名称并在打包时使用新的名称,具有一定的参考价值,感兴趣的可以了解下 …