深入理解Java中的Object类的equals()和hashCode()

news2024/11/16 20:29:17

文章目录

      • 1. equals()方法和hashCode()方法的联系
        • 1.1 equals()方法
        • 1.2 hashCode()方法
      • 2. equals()、hashCode()和集合类的关系
        • 2.1 equals()方法的影响
        • 2.2 hashCode()方法的影响
      • 3. 示例:重写equals()和hashCode()
      • 结论

在这里插入图片描述

🎉欢迎来到Java面试技巧专栏~深入理解Java中的Object类的equals()和hashCode()


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:Java面试技巧
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在Java编程中,Object类是所有类的基类,它提供了一些基本的方法来操作对象。其中,equals()hashCode()是两个重要的方法,它们在处理对象比较和哈希码计算方面具有关键作用。本文将深入探讨这两个方法的联系以及它们在Java编程中的应用。

在这里插入图片描述
在这里插入图片描述


1. equals()方法和hashCode()方法的联系

1.1 equals()方法

equals()方法用于比较两个对象是否相等。默认情况下,equals()方法比较的是对象的引用地址,即判断两个对象是否指向内存中的同一地址。然而,很多情况下我们需要自定义对象的相等性判断逻辑,例如判断对象的内容是否相等。因此,我们可以在类中重写equals()方法,实现自定义的对象比较逻辑。

1.2 hashCode()方法

hashCode()方法用于计算对象的哈希码(散列码)。哈希码是一个整数,用于快速地在哈希表等数据结构中查找对象。在Java中,哈希表的实现如HashMapHashSet等就是基于哈希码来进行快速查找的。默认情况下,hashCode()方法返回的是对象的内存地址的整数表示。同样地,我们也可以在类中重写hashCode()方法,自定义对象的哈希码计算逻辑。
在这里插入图片描述


2. equals()、hashCode()和集合类的关系

在Java中,很多集合类如HashMapHashSet等在内部使用了哈希表来存储数据。在使用这些集合类时,如果要正确地判断对象是否相等,就需要同时重写equals()hashCode()方法。

2.1 equals()方法的影响

如果我们重写了equals()方法来定义对象相等的规则,那么在集合类中判断两个对象是否相等时就会使用这个规则。

2.2 hashCode()方法的影响

在将对象放入哈希表中时,哈希表会根据对象的哈希码来确定存储的位置。因此,如果两个对象被判断为相等(根据equals()方法),那么它们的哈希码应该相等。即使两个对象的内容相同,但如果它们的哈希码不相等,哈希表会认为它们是不同的对象。

为了保证哈希表的正确性,我们需要确保以下关系成立:

  1. 如果两个对象相等,那么它们的哈希码必须相等。
  2. 如果两个对象的哈希码相等,它们不一定相等。
    在这里插入图片描述

3. 示例:重写equals()和hashCode()

下面是一个示例,展示了如何在自定义类中重写equals()hashCode()方法:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public static void main(String[] args) {
        Person person1 = new Person("Alice", 25);
        Person person2 = new Person("Bob", 30);

        Map<Person, String> personMap = new HashMap<>();
        personMap.put(person1, "Person 1 Data");
        personMap.put(person2, "Person 2 Data");

        System.out.println(personMap.get(person1)); // 输出:Person 1 Data
        System.out.println(personMap.get(person2)); // 输出:Person 2 Data
    }
}

在上述示例中,我们重写了equals()方法来根据nameage判断两个Person对象是否相等,同时也重写了hashCode()方法以保证相等的对象具有相同的哈希码。在使用HashMap存储Person对象时,可以正常地根据对象的内容进行查找和存储。
在这里插入图片描述


结论

equals()hashCode()`是Java编程中非常重要的方法,它们在对象比较和哈希码计算方面发挥着关键作用。通过正确地重写这两个方法,我们可以在集合类中正常地进行对象的存储和检索操作,保证程序的正确性和性能。同时,了解了这两个方法的关系,也能更好地理解Java中的集合类和对象操作。


🧸结尾


❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统

在这里插入图片描述

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

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

相关文章

2023河南萌新联赛第(六)场:河南理工大学

目录 A 简单的异或 题目&#xff1a; 解析&#xff1a; B 这是dp题吗 题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/63602/B 解析&#xff1a; D 买饼干的小Y 题目&#xff1a;https://ac.nowcoder.com/acm/contest/63602/D 解析&#xff1a; E 不爱吃早…

【jwt】JWT原理,JWT是用来解决什么问题的,如何自定义生成JWT数据,并且实现jwt数据的解码

JWT&#xff1a; JSON Web Token 1. jwt概述 用户登录成功后&#xff0c;服务端 如何知道客户端的每次请求对应的是哪个用户呢&#xff1f;怎么做&#xff1a;目前有两种方式实现. 1.1. 一是通过sessionId的方式&#xff0c;登录成功后服务端返回sessionId给客户端&#xff0…

【机器学习6】数据预处理(三)——处理类别数据(有序数据和标称数据)

处理类别数据 &#x1f331;简要理解处理类别数据的重要性☘️类别数据的分类☘️方便研究——用pandas创建包含多种特征的数据集&#x1f340;映射有序特征&#x1f340;标称特征标签编码&#x1f340;标称特征的独热编码&#x1f331;独热编码的优缺点 &#x1f331;简要理解…

爬虫逆向实战(八)--猿人学第十五题

一、数据接口分析 主页地址&#xff1a;猿人学第十五题 1、抓包 通过抓包可以发现数据接口是api/match/15 2、判断是否有加密参数 请求参数是否加密&#xff1f; 查看“载荷”模块可以发现有一个m加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cook…

Cat(3):客户端集成—简单案例

接下来编写一个简单的springboot与Cat整合的案例 1 新建springboot项目 首先创建一个Spring Boot的初始化工程。只需要勾选web依赖即可。 2 添加 Maven 添加依赖 <dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifa…

拉丁方设计资料的方差分析(SPSS版+SAS版)

拉丁方设计&#xff08;Latin square design&#xff09;&#xff1a;实验研究中涉及一个处理因素和两个控制因素&#xff0c;每个因素的类别数或水平数相等&#xff0c;此时可采用拉丁方设计&#xff0c;将两个控制因素分别安排在拉丁方设计的行和列上。该设计类型仍为单因素方…

生信豆芽菜-oncoPredict预测药物的敏感性

网址&#xff1a;http://www.sxdyc.com/drugOncoPredict 1、数据准备 准备一个行为基因&#xff0c;列为样本的表达谱矩阵即可 2、选择训练集数据库&#xff0c;提交等待运行成功即可 3、结果 当然&#xff0c;如果不清楚数据是什么样的&#xff0c;可以选择下载我们的示…

无涯教程-Perl - tell函数

描述 此函数返回指定FILEHANDLE中读取指针的当前位置(以字节为单位)。如果省略FILEHANDLE,则它将返回上次访问的文件中的位置。 语法 以下是此函数的简单语法- tell FILEHANDLEtell返回值 此函数以字节为单位返回当前文件位置。 例 以下是显示其基本用法的示例代码,要检…

RTSP/Onvif视频服务器EasyNVR视频监控汇聚平台的实际应用介绍

一、方案背景 在新时代的背景下&#xff0c;公安情报指挥体系建设需要在情报指挥中心为基础&#xff0c;以实现“情报全面精准、指挥集成统一、勤务协同高效、舆情管控有力”的目标。通过建设情指勤舆一体化指挥调度平台&#xff0c;将情报指挥中心打造成社会治安防控体系的核…

2023国考(地市级)判断推理

题目 黑白块 例题 例题 例题 例题

数据库的事务隔离级别(脏读、不可重复读、幻读)

并发事务问题 read uncommitted&#xff0c;存在脏读、不可重复度、幻读 read committed&#xff0c;存在不可重复读、幻读 repeatable read(默认)&#xff0c;存在幻读 serializable&#xff08;串行化&#xff0c;序列化&#xff09;&#xff0c;都不存在 前提&#xff1…

Android内存泄漏总结和性能优化技巧

我们在开发安卓应用时&#xff0c;性能优化是非常重要的方面。一方面&#xff0c;优化可以提高应用的响应速度、降低卡顿率和提升应用流畅度&#xff0c;从而提升用户体验&#xff1b;另一方面&#xff0c;优化也可以减少应用的资源占用&#xff0c;提高应用的稳定性和安全性&a…

ExcelServer Excel服务器的使用

Excel服务器的搭建 见 一步搭建Excel服务器 1、以EXCEL文件作为模板 1.1 利用excel易于使用的方式创建模板&#xff0c;并设置编辑&#xff0c;只读&#xff0c;函数等恪。 2、利用设置模板的权限 2.1 设置角色权限,允许哪些角色可以编辑 3、查看汇总的数据

java 设置JTable 不可编辑,但可以选择行。chatGPT就蒙了,最大的问题是哪些是自己想的,哪些有依据的及依据是什么。

这是对的。 tableModel new DefaultTableModel(new Object[]{"ID", "Name", "Type"}, 0){public boolean isCellEditable(int row, int column){return false;}};; 看看GPT的回答&#xff1a; 看似这个回事&#xff0c;但不对。 这个直接用中…

多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测&#xff0c;KOA-…

PS实现多个图片转化GIF动画

PS实现多个图片转化为GIF动画步骤 一、导入图片素材1.打开PS软件&#xff0c;点击 [文件] --- [脚本] ---[将文件载入堆栈]2.选择图片3.导入成功 二、打开时间轴1.点击[窗口]---[时间轴]2.选择创建帧动画3.创建帧动画 三、创建动画1.复制帧。2.设置帧的内容。3.修改图片停留的时…

JRebel插件扩展-mac版

前言 上一篇分享了mac开发环境的搭建&#xff0c;但是欠了博友几个优化的债&#xff0c;今天先还一个&#xff0c;那就是idea里jRebel插件的扩展。 一、场景回眸 这个如果在win环境那扩展是分分钟&#xff0c;一个exe文件点点就行。现在在mac环境就没有这样的dmg可以执行的&…

如何用Apipost实现sign签名?

我们平常对外的接口都会用到sign签名&#xff0c;对不同的用户提供不同的apikey ,这样可以提高接口请求的安全性&#xff0c;避免被人抓包后乱请求。 如何用Apipost实现sign签名&#xff1f; 可以在Apipost中通过预执行脚本调用内置的JS库去实现预执行脚本是在发送请求之前自…

(JAVA)事件

ActionListener public class Test3 {public static void main(String[] args){JFrame jFrame new JFrame();//设置界面的宽高jFrame.setSize(603,680);//设置界面标题jFrame.setTitle("事件演示");//设置界面置顶jFrame.setAlwaysOnTop(true);//设置界面居中jFram…

java初级算法(杨辉三角)

java初级算法&#xff08;杨辉三角&#xff09; java初级算法&#xff08;杨辉三角&#xff09;内容&#xff1a;思路解法&#xff1a;代码实现 学习时间&#xff1a;2023/08/16 java初级算法&#xff08;杨辉三角&#xff09; 每日一算法&#xff1a;杨辉三角 内容&#xff1a…