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

news2024/11/17 17:29:20

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
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);  // 输出 true

String 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.coloradmin.cn/o/1338728.html

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

相关文章

加速布局!美格智能获国内某自主大厂智能座舱项目模组定点

近日&#xff0c;销售前线又传来重大好消息&#xff0c;美格智能座舱模组正式获得国内某自主大厂前装智能座舱项目定点。此次项目由主机厂直接定点模组&#xff0c;基于美格智能座舱模组SLM925来打造平台化智能座舱解决方案&#xff0c;同时此方案也将会应用于该汽车品牌及旗下…

【JavaWeb学习笔记】15 - jQuery

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/jquery 目录 零、官方文档 一、jQuery基本介绍 1.基本介绍 2.原理图 二、JQuery入门使用 1.下载JQuery 2.jQuery快速入门 三、jQuery对象 1.什么是jQuery对象? 2.DOM对象转换成jQuery对象 …

数据结构与算法(C语言版)P11——查找

1、查找的基本概念 从着一章节开始学习查找&#xff0c; 查找时属于数据的运算里面的知识。 数据的元素包括&#xff1a;查找、排序、插入、删除、修改等。 问题一&#xff1a;那里查找&#xff1f; 首先要清楚&#xff0c;是在哪里进行查找操作&#xff1f;是在线性表中找…

【Redis】七、Redis主从复制(重点)

文章目录 1、概念1.1、主从复制的作用主要包括1.2、一般来说&#xff0c;要将Redis运用于工程项目中&#xff0c;只使用一台Redis是万万不能的&#xff08;宕机&#xff09;&#xff0c;原因如下 2、环境配置2.1、复制拷贝3个配置文件&#xff0c;然后修改对应的信息拷贝文件改…

2024,智能汽车走出独立曲线

文&#xff5c;刘俊宏 新能源汽车正在带领中国车市走向新的高峰。 在2023年&#xff0c;新能源汽车的增速显著超越整体车市。据中汽协预测&#xff0c;2023年&#xff0c;汽车总销量有望突破3000万辆&#xff0c;同比增长11.7%。其中&#xff0c;乘用车预计达到2600万辆&…

《软件需求分析报告》

第1章 序言 第2章 引言 2.1 项目概述 2.2 编写目的 2.3 文档约定 2.4 预期读者及阅读建议 第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 …

SpringBoot3 应用分析

SpringBoot3-快速入门 1、简介 1. 前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA 2. 环境要求 环境&工具版本&#xff08;or later&#xff09;SpringBoot3.0.5IDEA2021.2.1Java17Maven3.5Tomcat10.0Servlet5.0GraalVM Community22.3Native Build Tools0.9.1…

免费IDEA插件,Apipost出品!

IDEA插件市场中的API调试插件不是收费&#xff08;Fast Request &#xff09;就是不好用&#xff08;apidoc、apidocx等等&#xff09;今天给大家介绍一款国产的API调试插件&#xff1a;Apipost-Helper&#xff0c;完全免费且好看好用&#xff01; 这款插件由Apipost团队开发的…

12.26ARM作业

三个按键中断&#xff0c;控制对应灯亮灭 main.c #include "key_it.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){all_led_init();key1_it_config();key2_it_config();key3_it_config();while(1){printf("do main...\n&…

【每日一题】LeetCode160.相交链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1&#xff1a;示例2&#xff1a;提示&#xff1a; 2. 思路3. 代码 1. 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的…

【PTA】L1-32 Left-pad (C++)

题目链接&#xff1a;L1-032 Left-pad 题目要求&#xff1a; 根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块…

Mysql实时数据同步工具Alibaba Canal 使用

目录 Mysql实时数据同步工具Alibaba Canal 使用Canal是什么&#xff1f;工作原理重要版本更新说明 环境准备安装Canalwindow Java : Canal Client 集成依赖编码 工作流程其他学习canal资料 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; M…

7.7、kali linux环境下搭建DVWA

目录 一、资料下载准备工作 1.1、DVWA源代码下载 二、开启Apache、mysql服务 2.1、下载Apache2文件 2.2、开启Apache2服务 方法一&#xff1a;开启Apache2服务&#xff08;手动&#xff09; 方法二&#xff1a;开启Apache2服务&#xff08;系统自启动&#xff09; 2.3、…

Linux进行模型微调前的环境准备

在Linux机器上对模型进行微调前&#xff0c;首先需要准备环境&#xff0c;即安装相关的软件。因为linux是一个无界面操作系统&#xff0c;软件安装完成后&#xff0c;还需要有便捷的交互方式编写脚本&#xff0c;调试脚本。此篇博客将专门介绍如何快速安装所需依赖软件&#xf…

黑马程序员SSM框架-Spring

视频链接&#xff1a;Spring-00-Spring课程介绍_哔哩哔哩_bilibili Spring Framework系统架构以及学习顺序 核心概念&#xff08;IoC、DI、Bean&#xff09; IoC入门案例 导入坐标 提供需要被管理的类&#xff08;Dao&#xff09;和需要被注入的类&#xff08;Service&#x…

Unity中Shader裁剪空间推导(在Shader中实现)

文章目录 前言一、在Shader中&#xff0c;手动把正交相机的坐标转化到裁剪空间1、我们在属性面板定义一个变量&#xff0c;用于传入摄像机的信息2、获取h、r、w、n、f3、获取OpenGL下的转化矩阵4、 获取DirectX下的转化矩阵5、手动将观察空间下的坐标转换到裁剪空间下6、这里为…

Java 对象内存布局

在虚拟机中&#xff0c;Java对象在内存中的布局可以分为三块&#xff1a; 对象头&#xff08;Header&#xff09; &#xff1a;包含 markword 标记字段和类型指针&#xff0c;32 位上大小是 8 个字节&#xff0c;64 位 16 个字节&#xff0c;实例数据&#xff08;Instance Dat…

sql_lab之sqli中的搜索型注入

搜索型注入 原理是运用模糊查询&#xff1a; select * from users where username like %a% 1.找到具有模糊查询的搜索框的注入点 2.构造闭合 因为模糊查询的代码是 select * from users where username like %a% 所以应该 鱼%’ -- s 判断构造闭合的函数是否正确 鱼%…

【DeepLearning】Deep Residual Learning for Image Recognition恺神大作学习

[TOC] Deep Residual Learning for Image Recognition 论文 1. 文章主要想解决什么问题&#xff0c;用了什么方法 深度神经网络在训练过程中的3个关键问题&#xff1a; 梯度消失/爆炸问题&#xff1a;随着网络层数的增加&#xff0c;梯度在反向传播过程中可能会变得非常小&a…

浅谈政企风险防控体系

政企风控体系是集团客户部在生产运营过程中对政企产品可能面临的风险进行监测&#xff0c;针对监测发现的风险&#xff0c;制定相应的管控措施&#xff0c;并跟进落实&#xff0c;以最大限度地减少或消除风险对组织的影响的管控体系。 本文之所以称为“浅谈”是因为文中主要围绕…