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

文章目录

      • 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;}@Overridepublic 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);}@Overridepublic 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 DataSystem.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.hqwc.cn/news/70544.html

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

相关文章

uniapp 官方扩展组件 uni-combox 实现:只能选择不能手写(输入中支持过滤显示下拉列表)

uniapp 官方扩展组件 uni-combox 实现&#xff1a;只能选择不能手写&#xff08;输入中支持过滤显示下拉列表&#xff09; uni-comboxuni-combox 原本支持&#xff1a;问题&#xff1a; 改造源码参考资料 uni-combox uni-combox 原本支持&#xff1a; 下拉选择。输入关键字&am…

什么文件传输协议才能保障跨国文件传输安全又稳定

在当今的全球化时代&#xff0c;跨国文件传输是一种常见而又重要的需求&#xff0c;无论是个人还是企业&#xff0c;都需要通过网络来分享和交换各种类型和大小的文件。但是&#xff0c;跨国文件传输也面临着许多挑战和风险&#xff0c;如何选择一个合适的文件传输协议&#xf…

性能测试—Jmeter工具

文章目录 性能测试1. 术语介绍2. 方法3. 应用场景4. 工具&#xff08;Jmeter&#xff09;4.1 介绍4.2 元件和组件4.2.2 元件4.2.1 组件 4.3 作用域4.4 参数化4.5 执行脚本 性能测试 1. 术语介绍 响应时间(Response time)&#xff1a;对请求作出响应所需要的时间。 在互联网上对…

【简单认识zookeeper+kafka分布式消息队列集群的部署】

文章目录 一、zookeeper1、定义2、工作机制3、Zookeeper 特点4、Zookeeper 数据结构5、Zookeeper 应用场景6、Zookeeper 选举机制&#xff08;1&#xff09;第一次启动选举机制&#xff08;2&#xff09;非第一次启动选举机制 7、部署zookeeper群集 二、消息队列概述1、为什么需…

C语言实现将字典dict.txt上传到数据库中

代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sqlite3.h>int do_insert(sqlite3 *db,char *word,char *mean);int main(int argc, const char *argv[]) {//以读的方式打开文件FILE* fpfopen("./dict.txt",&…

好用的安卓手机投屏到mac分享

工具推荐&#xff1a;scrcpy github地址&#xff1a;https://github.com/Genymobile/scrcpy/tree/master mac使用方式 安装环境&#xff0c;打开terminal&#xff0c;执行以下命令&#xff0c;没有brew的先安装brew brew install scrcpy brew install android-platform-too…

Java Vue Uniapp MES生产执行管理系统

本MES系统是一款B/S结构、通用的生产执行管理系统&#xff0c;功能强大&#xff01; 系统基于多年离散智造行业的业务经验组建&#xff0c;主要目的是为国内离散制造业的中小企业提供一个专业化、通用性、低成本的MES系统解决方案。 联系作者获取

Python 实现性能自动化测试竟然如此简单

一、思考 ❓❔ 1.什么是性能自动化测试&#xff1f; 性能 系统负载能力超负荷运行下的稳定性系统瓶颈自动化测试 使用程序代替手工提升测试效率 性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Pytho…

计算机毕设项目之基于django+mysql的疫情实时监控大屏系统(前后全分离)

系统阐述的是一款新冠肺炎疫情实时监控系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体…

Nginx代理功能与负载均衡详解

序言 Nginx的代理功能与负载均衡功能是最常被用到的&#xff0c;关于nginx的基本语法常识与配置已在上篇文章中有说明&#xff0c;这篇就开门见山&#xff0c;先描述一些关于代理功能的配置&#xff0c;再说明负载均衡详细。 Nginx代理服务的配置说明 1、上一篇中我们在http…

《cpolar内网穿透》外网SSH远程连接linux(CentOS)服务器

本次教程我们来实现如何在外公网环境下&#xff0c;SSH远程连接家里/公司的Linux CentOS服务器&#xff0c;无需公网IP&#xff0c;也不需要设置路由器。 视频教程 [video(video-jrpesBrv-1680147672481)(type-csdn)(url-CSDN直播https://live-file.csdnimg.cn/release/live/…

计算机竞赛 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…