重写equals方法为什么还要重写hashcode方法?

目录

什么是 hashcode(哈希码、散列码)?

为什么 equals() 方法要重写?

hashCode() 与 equals() 的关系

重写equals方法为什么还要重写hashcode方法?


  • 什么是 hashcode(哈希码、散列码)?

想解决这个问题,要先知道什么是hashcode。hashCode是jdk根据对象的地址或者字符串或者数字算出来的 int 类型的数值,

hashcode 在 Object 的方法中源码是这样的:

public native int hashCode();

从源码可以看出,Object 中的 hashCode 调用了一个(native)本地方法,返回了一个 int 类型的整数,当然,这个整数可能是正数也可能是负数。

  • 为什么 equals() 方法要重写?

默认情况下,Java中的 equals() 比较的是对象的引用。

equals 方法在 Object 下的实现源码如下:

public boolean equals(Object obj) {return (this == obj);
}

 由此可见,相同的对象使用 equals() 进行比较结果会是 false ,这样就没有了比较的意义,所以要重写 equals 方法。

  • hashCode() 与 equals() 的关系

来了解一下 hashcode() 和 equals() 的关系:

1. 如果两个对象相等(equals 返回 true),则 hashcode 一定也是相同的

2. 如果两个对象不同(equals 返回 false),那么他们的 hashCode 值可能相同、可能不同

3. 如果两个对象的 hashcode 值相同(哈希冲突),那么它们可能相同、可能不同(equals 返回 true 或者返回 false)

4. 如果两个对象的 hashCode 值不同,那么它们一定不同(equals 返回 false)

equals()hashcode()
true(确定)true
false(确定)true / false
true / falsetrue(确定)
falsefalse(确实)

hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。

  • 重写equals方法为什么还要重写hashcode方法?

回归根本问题:为什么两个方法都要重写。这种情况通常发生在 set 集合去重,我们都知道 set 集合是用来保存不同对象的集合,也就是说 set 集合内没有重复的元素。但有时,set集合会出现“异常”,即没有进行去重操作。

原因就是:只重写了 equals 方法,但没有重写 hashCode 方法。具体分析一下,只重写equals方法,那么 set 进行去重操作时,先判断的是两个对象的 hashcode 是否相等,由于没有重写hashcode() 方法,所以执行的是 Object 类下的hashcode() 方法,此时比较的实际上是两个相同对象的不同引用地址,所以结果出现了 false ,导致 equals 方法不用执行下去,也返回了 false 结果,最后结论就变成了两个明明相同的对象比较的结果是不同的,于是set集合中就插入了两个相同的对象。

解决办法:在重写 equals 方法时,把 hashCode 方法也一起重写。这样的情况下,执行的就是重写的 hashcode() 方法,即比较两个对象的所有属性的 hashcode 是否相等,那么相同对象返回的结果就会是true,再去调用 equals 方法,则结果正确了,set集合就成功实现了去重操作。


综上:

equals方法被覆盖过,则hashCode方法也必须被覆盖

即!!!!重写equals方法时,也要重写一下 hashCode方法!!!!

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

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

相关文章

python爬虫之线程与多进程知识点记录

一、线程 1、概念 线程 在一个进程的内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”叫做线程 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指…

DAY01_Spring—Spring框架介绍IOCSpring工厂模式

目录 1 什么是框架2 Spring框架2.1 Spring介绍2.2 MVC模型说明2.3 IOC思想2.3.1 问题说明2.3.2 IOC说明 3 Spring IOC具体实现3.1 环境准备3.1.1 关于JDK说明3.1.2 检查JDK环境配置 3.2 创建项目3.3 关于Maven 命令3.3.1 install 命令3.3.2 clean 命令 3.4 添加jar包文件3.4.1 …

flutter使用getx进行数据状态管理,实现页面响应式

无论是什么样的应用,都还是需要最基础的数据来支撑的,而且不同的页面之间可能需要共享数据状态,这就显得数据状态管理非常有必要了。因为我这里使用了get依赖库,所以就可以直接在项目中使用getx来管理状态,不想再使用别…

【笔记】软件下载链接汇总

🎈欢迎加群交流🎈 ✨✨✨https://ling71.cn/hmf.jpg✨✨✨ 浏览器历史版本下载 Firefox史版本下载:(官网) http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ Chrome历史版本、ChromeDriver历史版本&#x…

服务器机房上架交付流程

服务器上架交付 服务器到货验收后,会进行机房机房上架,完成重装系统、网络配置后交付使用 1、到货验收 采购服务器到货后,会联合多部门进行SN、配置、数量等多方面验收,如数量是否匹配,配置是否相符等也会拆开机箱看看…

Python基础知识:整理10 异常相关知识

1 异常的捕获 1.1 基础写法 """基本语法:try:可能发生错误的代码except:如果出现异常,将执行的代码""" try:fr open("D:/abc.txt", "r", encoding"utf-8") except:print("出现异常…

APM传感器校准

文章目录 前言一、校准加速度计二、校准罗盘三、校准陀螺仪四、校平地平线 前言 固件:rover 4.2.3 地面站:独家汉化版QGC 一、校准加速度计 点击左上角软件图标-》载具设置-》传感器-》加速度计 飞控方向默认为None即可,点击确定 点击确…

德语怎么翻译,中文翻译成德文有何要求?

近年来,随着中德之间的贸易往来日益频繁,德语翻译需求在市场上持续升温。那么,如何做好德语翻译,特别是将中文翻译成德文需要注意哪些要求呢? 首先,深入理解中文原文的语境和含义至关重要。中文含蓄且抽象&…

存储的基本架构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、存储的需求背景二、自下而上存储架构总结 一、存储的需求背景 1、人的身份信息需要存储 这种信息可以用关系型数据库,例如mysql,那种表…

c++的宏举例和理解

宏提供了一种机制,能够使你在编译期替换代码中的符号或者语句。当你的代码中存在大量相似的、重复的代码时,使用宏可以极大的减少代码量,便于书写。 // 定义圆周率 #define PI 3.14159265 // 定义一个空指针 #define NULL ((void*)0) // 定…

第十二章 Java内存模型与线程(二)

文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.4 Java与线程 12.4.1 线程的实现 实现线程主要有三种方式:使用内核线程实现(1: 1 实现),使用用户线程实现(1&#xff…

CMake入门教程【高级篇】自定义的构建命令add_custom_command

文章目录 1.概述信息2.命令作用3.完整代码示例4. 实际使用中的技巧1.概述信息 add_custom_command是一个非常强大的工具,它允许用户定义在构建过程中执行的自定义命令。这可以用于生成源文件、执行前后处理步骤、自动化测试等。 #mermaid-svg-9icMsOnoxbNTRCu0 {font-family:…

A Charming Algorithm for Count-Distinct

如何估计不重复元素的个数 本文提出一种很有趣的算法,估计一个数列里面不重复元素的个数,关键是它只使用指定大小的内存。 I recently came across a paper called Distinct Elements in Streams: An Algorithm for the (Text) Book by Chakraborty,…

FFmpeg 入门

1. 编译 参考文档:FFmpeg编译和集成(FFmpeg开发基础知识),重点注意这句话: 在MSYS2 Packages可以查到云仓库有哪些包,直接安装可节约大量时间。 注意:这个路径可自定义 吐槽 在看到这篇文章之前,花了大…

腾讯云服务器购买指南,2024更新购买步骤

腾讯云服务器购买流程很简单,有两种购买方式,直接在官方活动上购买比较划算,在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵,但是自定义购买云服务器CPU内存带宽配置选择范围广,活动上购买只能选择固定的活动…

【银行测试】银行项目,信用卡业务测试+常问面试(三)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 银行测试-信用卡业…

产品经理之基础必备知识点

目录 前言 一.用户画像 1.1含义 1.2 举例说明 二.MVP(最小可行产品) 1.1含义 1.2 优缺点 三.体验地图 3.1 含义 3.2 举例说明 四.产品路线图 4.1 含义 4.2 举例说明 五.用户故事 5.1 含义 5.2 举例 六.用户故事地图 七.敏捷开发 7.1 含义 7.2 …

C++I/O流——(3)文件输入/输出(第二节)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 含泪播种的人一定能含笑收获&#xff…

[M链表] lc82. 删除排序链表中的重复元素 II(单链表+好题+模拟)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:82. 删除排序链表中的重复元素 II 相似题目:[E链表] lc83. 删除排序链表中的重复元素(单链表模拟) 2. 题目解析 这个题目与 83 题都很类似,一个是将重复元素全部删除,另一个…

面试宝典之ElasticSearch面试题

E01、什么是倒排索引? ES分词器通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索…