Java中equals()方法的理解与使用

Java中equals()方法的理解与使用

在Java中,equals()方法是用于比较两个对象是否相等的重要方法。它属于Object类的方法,因此所有的Java对象都继承了这个方法。但是,Object类中的equals()方法默认实现是比较两个对象的引用是否相同,即它们是否指向内存中的同一个对象。在实际开发中,我们往往需要根据对象的实际内容来判断是否相等,这时就需要重写equals()方法。

一、equals()方法的理解

equals()方法用于比较两个对象的内容是否相等,而不是比较它们的引用是否相同。例如,我们有两个Person对象,它们的姓名和年龄都相同,但它们是两个独立的对象,存储在内存中的不同位置。如果我们想要判断这两个对象是否“相等”(即它们的属性都相同),就需要重写equals()方法。

二、equals()方法的使用

1. 重写equals()方法

当我们需要比较两个对象的内容是否相等时,需要重写equals()方法。重写时,需要遵循以下几个原则:

  • 自反性:对于任何非null的引用值x,x.equals(x)必须返回true
  • 对称性:对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)也必须返回true
  • 传递性:对于任何非null的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应该返回true
  • 一致性:对于任何非null的引用值x和y,多次调用x.equals(y)始终返回true或始终返回false,前提是对象上equals比较中所用的信息没有被修改。
  • 对于任何非null的引用值x,x.equals(null)必须返回false

示例代码:

public class Person {private String name;private int age;// 构造函数、getter和setter方法省略...@Overridepublic boolean equals(Object obj) {// 1. 检查是否为同一个对象引用if (this == obj) {return true;}// 2. 检查传入对象是否为null以及类型是否匹配if (obj == null || getClass() != obj.getClass()) {return false;}// 3. 类型匹配,将obj转型为Person类型Person other = (Person) obj;// 4. 比较属性是否相等return age == other.age &&(name == null ? other.name == null : name.equals(other.name));}@Overridepublic int hashCode() {// 当重写equals方法时,通常也需要重写hashCode方法,以维护hashCode的一般约定// 这里使用简单的计算方式,实际应用中可能需要更复杂的计算来确保散列分布均匀return Objects.hash(name, age);}
}

2. 使用equals()方法

重写equals()方法后,我们就可以使用它来比较两个对象的内容是否相等了。

示例代码:

public class Main {public static void main(String[] args) {Person person1 = new Person("Alice", 25);Person person2 = new Person("Alice", 25);Person person3 = new Person("Bob", 30);// 使用equals()方法比较对象内容是否相等System.out.println("person1 equals person2: " + person1.equals(person2)); // 输出:trueSystem.out.println("person1 equals person3: " + person1.equals(person3)); // 输出:false// 注意:不要使用 == 来比较对象内容是否相等System.out.println("person1 == person2: " + (person1 == person2)); // 输出:false,因为person1和person2是两个不同的对象}
}

在上面的示例中,我们创建了三个Person对象,并使用equals()方法比较了它们的内容是否相等。可以看到,即使person1person2是两个不同的对象,但由于它们的属性相同,所以person1.equals(person2)返回true。而person1person3的属性不同,所以person1.equals(person3)返回false

总结

equals()方法在Java中扮演着非常重要的角色,特别是在处理对象比较时。默认情况下,equals()方法继承自Object类,仅仅比较两个对象的引用是否相同,即它们是否指向内存中的同一个位置。然而,在实际应用中,我们往往需要根据对象的实际内容(即对象的属性)来判断它们是否相等。这时,就需要重写equals()方法。

重写equals()方法时,需要遵循自反性、对称性、传递性、一致性和对于非null对象与null比较的规则。在比较对象属性时,如果属性也是对象,那么应该递归地调用这些对象的equals()方法进行比较,而不是简单地使用==操作符。

另外,当重写equals()方法时,通常也需要重写hashCode()方法,以确保两个相等的对象具有相同的哈希码。这是因为在Java中,很多集合类(如HashSetHashMap等)都依赖于hashCode()方法来实现高效的元素存储和检索。

使用equals()方法时,要注意不要与==操作符混淆。==操作符用于比较两个对象的引用是否相同,而equals()方法用于比较两个对象的内容是否相等。

总之,理解并正确使用equals()方法是Java编程中必不可少的一部分。通过重写equals()方法,我们可以根据对象的实际内容来判断它们是否相等,从而更准确地处理对象比较的逻辑。同时,也要注意与==操作符的区别,避免在代码中产生逻辑错误。

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

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

相关文章

FPGA“题目周周练”活动来啦!

Hi,各位编程精英er~ 不知道大家的FPGA学习之旅到达哪一个阶段了呢?又在这个过程中遇到了哪些困惑? 作为一门高度专业化且充满挑战的技术,FPGA的学习是一场不断思考、认知、持续深化的过程。在这个过程中,思维的敏捷和…

【vue2】实现微信截图(复制图片)在项目内可粘贴

需求 后台管理在上传图片地方需要将复制的图片粘贴上传 一、添加事件 在原有上传组件的基础上添加 paste事件 二、方法 onPaste(e) {const items (e.clipboardData || window.clipboardData).items;let blob null;for (let i 0; i < items.length; i) {if (items[i].ty…

034——从GUI->Client->Server->driver实现读写EEPROM

目录 1、修改GUI 2、修改client 3、 修改server 4、 修改driver_handele 5、 测试和提交 1、修改GUI 之前叫IIC&#xff0c;我们其实是借助EEPROM来测试IIC是不是好用所以名称改一改 长得有点奇怪 这样虽然一样长了但是还是很奇怪。 就先这样吧 layout_l [[tool.name(N…

100个实用电气知识

在当今社会&#xff0c;电力作为日常生活和工作中不可或缺的能源&#xff0c;扮演着越来越重要的角色。为了更好地利用电力资源&#xff0c;了解电气知识成为了越来越多人的需求。在电气领域&#xff0c;有很多实用的知识&#xff0c;这些知识对于从事电气工作的人来说是非常重…

二叉树oj题(2)

1.二叉树的最近公共祖先 解题思路&#xff1a;方法一&#xff1a; 1.先判断p或者q 是不是 root当中的一个 2.左子树当中递归査找p或者q 3.右子树当中递归查找p或者q 如何查找: root 的 left 和 right 都不为空 ->root root的 left 为空 right 不为空->right这一侧找…

出海不出局 | 小游戏引爆高线市场,新竞争态势下的应用出海攻略

出海小游戏&#xff0c;出息了&#xff01; 根据 Sensor Tower 近期发布的“2024 年 3 月中国手游收入 TOP30”榜单&#xff0c;出海小游戏在榜单中成了亮眼的存在。 其中&#xff0c;《菇勇者传说》3 月海外收入环比增长 63%&#xff0c;斩获出海手游收入增长冠军&#xff0c…

vue element-ui 表格横向滚动条在合计项下方

目前效果 需求效果 1.隐藏bodyWrapper滚动条&#xff0c;显示footerWrapper滚动条 css代码如下&#xff1a; div ::v-deep .el-table--scrollable-x .el-table__body-wrapper{overflow-x: hidden!important;z-index: 2!important;} div ::v-deep .el-table__footer-wrapper …

理发师问题的业务建模方案

背景 题目&#xff1a; 假设有一个理发店只有一个理发师&#xff0c;一张理发时坐的椅子&#xff0c;若干张普通椅子顾客供等候时坐。没有顾客时&#xff0c;理发师睡觉。顾客一到&#xff0c;叫醒理发师 。如果理发师没有睡觉&#xff0c;而在为别人理发&#xff0c;他就会坐…

Android—— log的记忆

一、关键log 1.Java的 backtrace(堆栈log) 上述是一个空指针异常&#xff0c;问题出现在sgtc.settings&#xff0c;所以属于客户UI问题。 2.WindowManager(管理屏幕上的窗口和视图层次结构) 3.ActivityManager(管理应用程序生命周期和任务栈) 4.wifi操作 (1) 连接wifi&#…

开源大模型Llama3,堪比GPT-4。手把手本地安装,纯小白可操作,不需要编程经验,国内可下载,可视化使用。

最近最劲爆科技动态&#xff0c;Meta开源Llama3模型&#xff0c;最强开源模型。 Llama3发布后&#xff0c;扎克伯格亲自给媒体表示“要超越所有人&#xff0c;做最领先AI”。 吴恩达等一众大佬表示祝贺。 在线体验地址&#xff1a;https://www.meta.ai/ 不过国内在线体验基本…

OpenWRT磁盘扩容(PVE虚拟机方案)

官方扩容指导文档 PVE给虚拟机磁盘扩容 给虚拟机磁盘扩容&#xff0c;选中OpenWRT的硬盘&#xff0c;随后选择调整大小 输入增量大小&#xff0c;即增加多少磁盘空间给硬盘。这里我选择增加4G 进入OpenWRT控制台界面安装一些linux常用查看磁盘的工具&#xff08;也可以通过网…

EasyPoi实现简单的Excel导出、导入

EasyPoi实现Excel导出、导入 下面这种方式不需要模板&#xff0c;更加方便但是不能进行复杂的导出 一、引入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version><…

2024商业地产五一劳动节健康大会朋克养生市集活动策划方案

2024商业地产五一劳动节健康大会朋克养生市集&#xff08;带薪健康 快乐打工主题&#xff09;活动策划方案 活动策划信息&#xff1a; 方案页码&#xff1a;53页 文件格式&#xff1a;PPT 方案简介&#xff1a; 打工不养生 赚钱养医生 期待已久的五一假期&#xff0c; …

mysql download 2024

好久没在官网下载 mysql server 安装包。今天想下载发现&#xff1a; 我访问mysql官网的速度好慢啊。mysql server 的下载页面在哪里啊&#xff0c;一下两下找不到。 最后&#xff0c;慢慢悠悠终于找到了下载页面&#xff0c;如下&#xff1a; https://dev.mysql.com/downlo…

什么是全局特征,什么又是局部特征

全局特征和局部特征是用来描述数据中信息的两种不同方式&#xff0c;特别是在图像处理、模式识别和机器学习领域中经常被提到。它们有助于理解和分析数据的不同层面&#xff1a; 全局特征&#xff08;Global Features&#xff09; 全局特征描述了整个数据集的整体属性。在图像…

windows和linux服务器等保测评加固方法

服务器加固是通过各种方法增强服务器安全性的过程。保护操作系统免受黑客、破解者和攻击者的侵害。网络安全防护的目标是保密性、完整性、可用性、可控制性、不可否认性。 一、window服务器等保加固 以win2012和win2008 为例&#xff1a; &#xff08;win2008&#xff09; …

【UML建模】用例图

1 参与者 参与者的概念&#xff1a; 指系统以外的、需要使用系统或与系统交互的外部实体 可以分为&#xff1a;人、外部设备、外部系统 参与者的图形符号&#xff1a; 例 3.1 在一个银行业务系统中&#xff0c;可能会有以下参与者 客户 &#xff1a;在银行业务系统中办理…

React【Day2】

React表单控制 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 双向绑定 MVVM 报错记录&#xff1a; 错误代码&#xff1a; import { useState } from "react";const App () > {const [value, setValue] useS…

TLV61048非同步升压BOOST转换器输入电压2.6-5.5V输出电流4A输出电压最高15V

推荐原因&#xff1a; 输入电压较低&#xff0c;输出电流可达3.5A SOT23-6封装 批量价格约0.70元 TLV61048引脚 TLV61048引脚功能 7 详细说明 7.1 概述 TLV61048是一款非同步升压转换器&#xff0c;支持高达 15 V 的输出电压和输入范围从 2.61 V 到 5.5 V。该TLV61048集成了…

LlamaIndex 加 Ollama 实现 Agent

AI Agent 是 AIGC 落地实现的场景之一&#xff0c;与 RAG 不同&#xff0c;RAG 是对数据的扩充&#xff0c;是模型可以学习到新数据或者本地私有数据。AI Agent 是自己推理&#xff0c;自己做&#xff0c;例如你对 AI Agent 说我要知道今天上海的天气怎么样&#xff0c;由于 AI…