【Java基础系列】equals方法使用与总结

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.基本介绍
      • 1.基本介绍
      • 2."=="(相等运算符)
      • 3."equals" 方法
    • 二.使用案例
      • 1.equals 方法
      • 2.equalsIgnoreCase 方法
      • 3.equalsAnyIgnoreCase 方法
    • 三.面试题
      • 1.比较两个对象内容是否相同
      • 2.hashCode() 和 equals()
      • 3.阿里巴巴 Java 开发手册

一.基本介绍

1.基本介绍

在编程中,“==” 和 “equals” 是两个经常用到的比较概念,它们的具体含义和使用场景取决于编程语言的设计和约定。

2.“==”(相等运算符)

  • “==” 是一种比较运算符,用于检查两个变量或对象是否相等。
  • “==” 对于基本数据类型(如整数、浮点数等)通常比较它们的值是否相等。
  • 对于引用类型(如对象),“==” 通常比较的是对象的引用,即它们是否引用了相同的内存地址。

示例(Java):

int a = 5;
int b = 5;
System.out.println(a == b);  // 输出 trueString str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);  // 输出 false,因为它们是不同的对象

3.“equals” 方法

  • “equals” 是一个方法,通常被用于比较对象的内容是否相等,而不仅仅是比较引用是否相等。
  • 通常需要覆盖(override)“equals” 方法来自定义对象相等的判断逻辑。
  • Object 类中的 “equals” 方法默认行为是比较对象的引用,因此需要在自定义类中进行重写。

示例(Java):

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));  // 输出 true,因为重写了 String 类的 equals 方法

“==” 通常用于比较基本数据类型的值或引用类型的引用,而 “equals” 方法通常用于比较对象的内容是否相等。在使用 “equals” 方法时,需要注意确保该方法已经被适当地重写,以符合你的比较需求。

二.使用案例

在 Java 中,equalsequalsIgnoreCaseequalsAnyIgnoreCase 是字符串比较的三种不同方法,用于判断字符串是否相等。以下是它们的主要区别:

1.equals 方法

equals 方法:

  • equals 方法是 Object 类中的方法,用于比较两个对象是否相等。
  • 在字符串比较中,equals 通常被用来比较两个字符串对象的内容是否完全相同。

示例(Java):

String str1 = "hello";
String str2 = "hello";
System.out.println(str1.equals(str2));  // 输出 true

2.equalsIgnoreCase 方法

equalsIgnoreCase 方法:

  • equalsIgnoreCase 方法是 String 类中的方法,用于比较两个字符串的内容是否相等,而不区分大小写。
  • 这意味着它会忽略字符串中的大小写差异。

示例(Java):

String str1 = "hello";
String str2 = "HELLO";
System.out.println(str1.equalsIgnoreCase(str2));  // 输出 true

3.equalsAnyIgnoreCase 方法

equalsAnyIgnoreCase 方法:

  • equalsAnyIgnoreCase 方法通常不是 Java 标准库中的方法,而是可能出现在一些自定义的库或框架中。
  • 它的作用类似于 equalsIgnoreCase,但可以同时比较多个字符串是否与目标字符串相等,且忽略大小写。

示例(假设存在这样的方法):

String str = "hello";
boolean result = equalsAnyIgnoreCase(str, "HELLO", "Hi", "Hey");
System.out.println(result);  // 输出 true,因为"hello"与"HELLO"相等

需要注意的是,对于 equalsequalsIgnoreCase 方法,建议在比较之前检查对象是否为 null,以避免可能的 NullPointerException。例如:

String str1 = "hello";
String str2 = // some value or possibly null
if (str1.equals(str2)) {// do something
}

在上述代码中,如果 str2null,调用 equals 方法会导致 NullPointerException。可以使用 Objects.equals 方法来处理这种情况:

if (Objects.equals(str1, str2)) {// do something
}

总的来说,选择使用哪种方法取决于你的具体需求,是需要区分大小写还是忽略大小写,以及是否需要同时比较多个字符串。

三.面试题

1.比较两个对象内容是否相同

如何比较两个对象内容是否相同?(重写 equals)

例如一个 Student 类,new 两个对象出来,单纯的想比较内容是否相同如何做呢。

public class Student {private String name;public int age;// get set ...
}

通过 equals() 比较两个对象是否相同,默认情况下,比较的是地址值是否相同。而比较地址值是没有意义的,所以,一般子类也会重写该方法。在诸多子类,如 String、Integer、Date 等均重写了 equals() 方法

改进思路:我们可以将比较地址值转变为比较成员变量

  • 因为 name 为 String 类型,而 String 类型为引用类型,所以不能够用 == 比较,应该用 equal()
  • String 中默认重写过的 equal() 方法是用来比较字符串内容是否相同
  • 我们要使用的是学生类的成员变量,所以父类 Object 不能调用子类 Student 的特有功能,所以使用向下转型
//重写v1.0
public boolean equals(Object o) {Student s = (Student) o;if (this.name.equals(s.name) && this.age == s.age) {return true;} else {return false;}
}
//重写v2.0 (可作为最终版)
public boolean equals(Object o) {if (this.name == o) {return true;}//测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。if (!(o instanceof Student)) {return false;}Student s = (Student) o;return this.name.equals(s.name) && this.age == s.age;
}
// IDEA自动生成版
@Override
public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name);
}

2.hashCode() 和 equals()

hashCode() 方法是 Object 类中的一个本地方法(用 c 语言或 c++ 实现的),会返回该对象的哈希码,也称为散列码;其本质是返回一个 int 整数。哈希码的作用是确定该对象在哈希表中的索引位置。可以通过散列码,在散列表中根据“键”快速的检索出对应的“值”。从而快速找到需要的对象,然后进行判断是不是同一个对象。

public native int hashCode();//hashCode源码
public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;
}

equals() 方法是 Object 类中的一个方法,如果没有对 equals 方法进行重写,则比较的是引用类型的变量所指向的对象的地址。一般会选择重写此方法,来比较两个对象的内容是否相等,相等则返回 true。

总结:单考虑目的两者是差不多的,都是用来对比两个对象是否相等一致。

equals() 已经实现功能了,还需要 hashCode() 做什么?

重写 equals() 里面的内容一般比较全面周详,但是效率就比较低,例如:如果集合中现在已经有 2000 个元素,那么第 2001 个元素加入集合时,它就要调用 2000 次 equals 方法。

而使用 hashCode() ,其使用的哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上,所以 hashCode() 这种形成 hash 码的方式比较是比较高效的。

为什么不全部使用高效率的 hashCode(),还要用 equals()?

hashCode() 方法不是一个 100% 可靠的方法,个别情况下,不同的对象生成的 hashcode 也可能会相同。

hashCode() 和 equals() 是如何一起判断保证高效又可靠的?

如果大量内容都是用 equals() 去比对,效率显然是比较低的,所以每次比对之前都去使用 hashCode() 去对比,如果返回的 hashCode 不同,代表两个对象肯定不相同,就可以直接返回结果了。如果 hashCode 相同,又为了保证其绝对可靠,所以使用 equals() 再次进行比对,同样是相同,就保证了这两个对象绝对相同。

为什么重写 equals 时必须重写 hashCode 方法?

如果重写了 equals() 而未重写 hashcode() 方法,可能就会出现两个字面数据相同的对象(例如下面 stu1 和 stu2) equals 相同(因为 equals 都是根据对象的特征进行重写的),但 hashcode 不相同的情况。

public class Student {private String name;public int age;// get set ...// 重写 equals() 不重写 hashcode()
}
--------------------------------------------
Student stu1 = new Student("BWH_Steven",22);
Student stu2 = new Student("BWH_Steven",22);
--------------------------------------------
stu1.equals(stu2); // true
stu1.hashCode();  // 和 stu2.hashCode(); 结果不一致
stu2.hashCode();

如果把对象保存到 HashTable、HashMap、HashSet 等中(不允许重复),这种情况下,去查找的时候,由于都是先使用 hashCode() 去对比,如果返回的 hashCode 不同,则会认为对象不同。可以存储,从内容上看,明显就重复了。

所以一般的地方不需要重写 hashcode() ,只有当类需要放在 HashTable、HashMap、HashSet 等 hash 结构的集合时才会去重写。

3.阿里巴巴 Java 开发手册

补充:阿里巴巴 Java 开发手册关于 hashCode 和 equals 的处理遵循规则:

  • 只要重写 equals,就必须重写 hashCode。
  • 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。
  • 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals。
  • String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作为 key 来使用。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

CamSim相机模拟器:极大加速图像处理开发与验证过程

随着图像处理技术的不断发展&#xff0c;相机模拟在图像处理开发和验证中扮演着越来越重要的角色。相机模拟能够模拟真实相机的成像过程&#xff0c;提供高质量的图像输入&#xff0c;使开发人员能够更好地评估和调整图像处理算法。本文将探讨如何通过相机模拟来加速图像处理的…

vue实现H5拖拽可视化编辑器

一款专注可视化平台工具&#xff0c;功能强大&#xff0c;高可扩展的HTML5可视化编辑器&#xff0c;致力于提供一套简单易用、高效创新、无限可能的解决方案。技术栈采用vue和typescript开发, 专注研发创新工具。 <template><div:style"style":class"…

MYSQL数据库的安全管理-数据库实验六

Mysql数据库实验及练习题相关 MySQL 数据库和表的管理-数据库实验一 MySQL连接查询、索引、视图-数据库实验二、实验三 MySQL约束、触发器-数据库实验四 MYSQL存储过程和存储函数-数据库实验五 MySQL批量随机生成name、TEL、idNumber MYSQL数据库的安全管理-数据库实验六 MYSQ…

<JavaEE> TCP 的通信机制(二) -- 连接管理(三次握手和四次挥手)

目录 TCP的通信机制的核心特性 三、连接管理 1&#xff09;什么是连接管理&#xff1f; 2&#xff09;“三次握手”建立连接 1> 什么是“三次握手”&#xff1f; 2> “三次握手”的核心作用是什么&#xff1f; 3&#xff09;“四次挥手”断开连接 1> 什么是“…

第2课 用FFmpeg读取rtmp流并显示视频

这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本功能其实就两个:显示画面和播放声音。在实现这两个功能前&#xff0c;我们需要先用ffmpeg连接到rtmp服务器&#xff0c;当然也可以打开一个文件。 1.压缩备份上节课工程文件夹为demo.rar&#xff0c;并修…

ZETA落地合肥、宜城南方水泥,纵行科技携手中才邦业助力水泥企业数智化管理

近日&#xff0c;合肥南方水泥、宜城南方水泥落地ZETA预测性维护方案&#xff0c;通过在水泥厂内搭建ZETA网络&#xff0c;并在B类及C类主辅机设备上安装ZETA系列端智能传感器&#xff0c;进行数据采集和监测设备运行状态、以及早期故障警报和诊断&#xff0c;实现水泥生产设备…

web期末大作业--网页设计 HTML+CSS+JS(附源码)

目录 一&#xff0c;作品介绍 二.运用知识 三.作品详情 四.部分作品效果图 我的&#xff1a;​编辑 五.部分源代码 六.文件目录 七.源码 一&#xff0c;作品介绍 作品介绍&#xff1a;该作品是一个是一个关于影视作品的网页&#xff0c;一共有五个页面&#xff0c;主页&a…

文件IO

文章目录 文章目录 前言 一 . 文件 文件路径 文件类型 Java中操作文件 File 概述 属性 构造方法 方法 createNewFile mkdir 二 . 文件内容的读写 - IO InputStream 概述 FileInputStream 概述 利用 Scanner 进行字符读取 OutputStream 概述 PrintWriter封装O…

gin框架使用系列之五——表单校验

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》 一 、表单验证的基本理论 在第三篇中&#xff0c;我们介绍了如何…

Flink1.17实战教程(第四篇:处理函数)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

C# LINQ

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第22章《LINQ》 二、LINQ to XML 我们可以通过LINQ to XML来创造xml文件 如下示例&#xff0c;我们用LINQ to XML来创造。 <Books><CSharp Time"2019"><book>C# 入门经典</book><…

uniapp 输入手机号并且正则校验

1.<input input“onInput” :value“phoneNum” type“number” maxlength“11”/> 3. method里面写 onInput(e){ this.phoneNum e.detail.value }, 4.调用接口时候校验正则 if (!/^1[3456789]\d{9}$/.test(this.phoneNum)) {uni.showToast({title: 请输入正确的手机号…

对于c++的总结与思考

笔者觉得好用的学习方法&#xff1a;模板法 1.采用原因&#xff1a;由于刚从c语言面向过程的学习中解脱出来&#xff0c;立即把思路从面向过程转到面向对象肯定不现实&#xff0c;加之全新的复杂语法与操作&#xff0c;着实给新手学习这门语言带来了不小的困难。所以&#xff…

【动画视频生成】

转自&#xff1a;机器之心 动画视频生成这几天火了&#xff0c;这次 NUS、字节的新框架不仅效果自然流畅&#xff0c;还在视频保真度方面比其他方法强了一大截。 最近&#xff0c;阿里研究团队构建了一种名为 Animate Anyone 的方法&#xff0c;只需要一张人物照片&#xff0…

数据结构与算法教程,数据结构C语言版教程!(第一部分、数据结构快速入门,数据结构基础详解)二

第一部分、数据结构快速入门&#xff0c;数据结构基础详解 数据结构基础&#xff0c;主要研究数据存储的方式。 本章作为数据结构的入门课程&#xff0c;主要让读者明白&#xff0c;数据结构到底是什么&#xff0c;常用的数据存储结构有哪些&#xff0c;数据结构和算法之间到底…

钉钉机器人接入定时器(钉钉API+XXL-JOB)

钉钉机器人接入定时器&#xff08;钉钉APIXXL-JOB&#xff09; 首先需要创建钉钉内部群 在群设置中找到机器人选项 选择“自定义”机器人 通过Webhook接入自定义服务 创建完成后会生成一个send URL和一个加签码 下面就是干货 代码部分了 DingDingUtil.sendMessageByText(webho…

【Python】ubuntu python>3.9编译安装,及多个Python版本并存的使用方法

【Python】ubuntu python3.9编译安装&#xff0c;及多个Python版本并存的使用方法 1. 安装依赖2. 编译与安装2.1 依赖与源获取2.2 配置2.3 编译2.4 安装2.5 链接动态库 3. 多版本兼容 1. 安装依赖 更新系统软件 在正式开始之前&#xff0c;建议首先检查系统软件是否均为最新&a…

构建高效数据中台:集群规划与搭建的最佳实践指南

架构设计 Rack(机架)配置建议 大数据集群规划 安装细节见配套文档 YARN资源管理平台队列调度策略 Capacity Scheduler 默认配置下,Capacity Scheduler 将尝试保证每个队列在其分配的容量内公平地使用资源。 然而,Hadoop 也支持通过调整队列的权重和使用抢占策略来优化资…

《Spring Cloud学习笔记:微服务保护Sentinel》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

微信小程序开发系列-04获取用户图像和昵称

这个功能的实现对于我这个新手来说可谓是一波三折。该功能的实现经历了三个“版本”的迭代&#xff0c;我的运气不是很好&#xff0c;从第一个“版本”开始尝试&#xff0c;这篇文章也是记录下这个过程&#xff0c;以便其他新手能快速找到解决方案。 Gen1-getUserInfo 第一个…