重写equals为什么要重写hashCode

答:因为两个相等的对象的 hashCode值必须是相等。也就是说如果equals方法判断两个对象是相等的,那这两个对象的hashCode值也要相等。

如果重写equals()时没有重写 hashCode()方法的话就可能会导致equals方法判断是相等的两个对象,hashcode值却不相等。

我们知道一旦重写了equals方法,就一定要重写hashCode方法。为什么?

------因为必须保证重写后的equals方法认定相同的两个对象拥有相同的哈希值

------当我们将equals方法重写后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中“相同对象必须有相同哈希值”的约定。

那么怎样去解释这句话?接着往下看。

我们打开Object类的equals方法源码,可以看到有一部分注释是这样写的:

大致意思是:每当重写 equals方法后, hashCode 方法通常也需要重写,以便维护 hashCode 方法的一般协定,该协定声明相等的对象必须具有相等的哈希值

那为什么要去维护 hashCode 方法的协议呢?找到hashCode方法源码,这里给出了解释:

首先hashCode方法相当于一个哈希函数,将对象的内部地址转换为一个integer类型的哈希值。

hashCode总的契约有三条,分别是:

   1、一个对象多次调用他的hashCode应该返回相同的整数(哈希值);

   2、如果两个对象根据equals方法判断是相等的,那么这两个对象返回的整数也应该相同;

   3、如果两个对象根据equals判断是不相等的,不要求返回不同的整数,但不同的整数结果对应的对象也应该是不同的。

以画图的方式表示这三条契约:

 equals方法和hashCode方法两者的关系,总结一下就是:

  1. 如果两个对象相同(equals返回true),那么他们的hashCode值一定相同;
  2. 如果两个对象不同(equals返回false),那么他们的hashCode值可能相同可能不同;
  3. 如果两个对象的hashCode值相同(hash冲突),那么他们可能相同也可能不同(equals方法返回false / true);
  4. 如果两个对象的hashCode值不同,那么他们肯定不同(equals返回false)。

其实到这里,我们就明白equals方法与hashCode方法是配套使用的。对于任何一个对象,不论是使用继承自Object的equals方法还是重写equals方法。hashCode方法实际上必须要完成的一件事情就是,为该equals方法认定为相同的对象返回相同的哈希值。

⭕还要注意一点就是,当重写equals方法时通常将hashCode方法重写,提高比较效率。

(例如先求hashCode值,如果相等 再使用equals比较,比起用equals挨个比较块且便捷) 



以上就是理论内容,下面举个例子: 

问题一:我对左侧QueryBO的equals方法和hashCode方法进行了重写,在右边的比较中应该输出什么? 

-----true

-----原因:如果不重写equals,那么只有两对象内所有属性都相同才认为相等;而现在我重写了equals,这里只需要对象的query3相等,则认为两对象想等。

问题二:将queryBO1对象和queryBO2放进Set集合,Set集合中有几个对象? 

-----1个

-----由于上一步判定两对象相等,而Set集合中的元素是不重复的,所以Set中只有一个元素。

Set<QueryBO> set=new HashSet<>(); set.add(queryBO1); set.add(queryBO2); System.out.println("Set:"+set); //输出 Set:[QueryBO(query1=true, query2=true, query3=false)]

问题三:将代码更改,再次进行上述两步操作,这次的答案又是什么

输出:

Set:[QueryBO(query1=true, query2=true, query3=false), QueryBO(query1=false, query2=true, query3=true)] true

-----为什么equals比较结果为true,但去重集合Set中却有两个元素呢?

-----原因:像HashSet、HashMap这类 判断两对象相不相同先比较的是hashCode( ),equals比较的是query2,而hashCode比较的是query3,hashCode不相等了,所以我们的HashSet也会认为两个对象不相等。

所以注意 重写equals( )一定要重写hashCode( ) !

 问题四:字符串的hashCode相等,这两个对象一定相等吗?(hashCode相等的字符串一定相等?)

-----错。hashCode相等两个字符串不一定相等。

-----例子:一下这些字符串的hashCode都一样。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW通过编程将图形类控件的X轴显示为时间戳

LabVIEW通过编程将图形类控件的X轴显示为时间戳 每个版本的LabVIEW中都有属性节点&#xff0c;可以以编程方式调整X轴和Y轴格式。对于不同版本的LabVIEW&#xff0c;这些属性节点无法在同一个位置找到。请参阅以下部分&#xff0c;了解特定版本LabVIEW的相关属性节点的位置。 …

供应商关系管理软件:如何使用它来改善供应商关系?

从最基本的角度来说&#xff0c;企业需要供应商为其生产和销售的产品或服务提供原材料&#xff0c;或者为其提供资源和服务来经营自己的业务。 建立稳定而健康的供应商关系的最大优势之一&#xff0c;就是可以为企业带来更高的价值。企业对供应商了解越多&#xff0c;供应商对…

强基固本,红海云数字化重塑提升国企干部管理能力

国有企业的干部管理体系建设具有重要的战略意义&#xff0c;对于构建高素质专业化的干部队伍&#xff0c;推动企业高质量发展至关重要。特别是在党的二十大以后&#xff0c;建设中国特色现代企业制度&#xff0c;在完善公司治理中加强党的领导&#xff0c;加强党管干部党管人才…

全球市场:跨境电商消费者权益维权的趋势

随着数字技术的迅猛发展&#xff0c;跨境电商逐渐成为全球贸易的引领者&#xff0c;但与此同时&#xff0c;消费者权益维权问题也备受关注。本文将深入探讨跨境电商消费者权益维权的趋势&#xff0c;剖析全球市场中涌现的挑战和解决方案&#xff0c;以期为构建更加公平、透明的…

GoWeb学习-第二天

文章目录 从零开始学Go web——第二天一、安装Go语言二、建立web目录2.1 创建GO语言包目录2.2 创建Go web文件 三、编译并运行Go web应用3.1 编译并运行3.2 查看结果 从零开始学Go web——第二天 ​ 第一天我们了解了与web息息相关的HTTP协议&#xff0c;聊了聊Go与web的关系等…

struts2 代码执行 (CVE-2020-17530)

struts2 代码执行 &#xff08;CVE-2020-17530&#xff09; 使用struts2框架的网站 URL上会有.action结尾这个特征 名称: struts2 代码执行 &#xff08;CVE-2020-17530&#xff09; 描述: Struts2是一个基于MVC设计模式的Web应用框架&#xff0c;它本质上相当于一个servlet…

PM2 在线和离线部署uvicorn和fastapi项目过程

PM2介绍 PM2 is a daemon process manager that will help you manage and keep your application online 24/7 PM2是一个后台进程管理工具&#xff0c;能帮助管理应用和维持应用7*24小时运行。 PM2在线安装 npm install pm2 -gPM2离线安装(适用于内网) 参见 如何离线安装pm2…

算法通关村第二关—手写链表反转(青铜)

链表反转的三种方式 一、建立虚拟头结点辅助反转 为了方便反转&#xff0c;可以创建一个ans结点&#xff0c;让ans.next head,然后后面的结点一次插入到ans.next 在下图中&#xff0c;对&#xff08;1->2->3->4->5&#xff09;进行反转&#xff0c;可以创建ans&…

马骑顿部署实在RPA,所产价值超该项目投入6倍

“数字化最大的挑战在于我们增长太快了&#xff0c;对于全域经营的DTC品牌来说&#xff0c;让一个部门去管理所有平台数据&#xff0c;形成品牌全域生意的协同实非易事。”马骑顿运营部负责人表示。2022年&#xff0c;马骑顿搭建企业数据中台&#xff0c;统一管理线上数据&…

wsj0数据集原始文件.wv1.wv2转换成wav文件

文章目录 准备一、获取WSJO数据集二、安装sph2pipe三、转换代码四、结果展示 ​ 最近做语音分离实验需要用到wsj0-2mix数据集&#xff0c;但是从李宏毅语音分离教程里面获取的wsj0-2mix只有一部分。从网上获取到了完整的WSJO数据集后&#xff0c;由于原始的语音文件后缀是wv1或…

网关路由器双栈配置中的IPv6相关选项解析

1、引言 讲知识往往是枯燥无味的&#xff0c;我们先从问题入手。家庭网关&#xff08;光猫&#xff09;、路由器是我们每个人或多或少都有所接触的2种设备。现在一般都是光纤入户&#xff0c;通常每个家庭配备一个光猫和一台家用路由器。 目前有许多网络服务已经提供了IPv6支…

距离“全自动”漏洞挖掘又近了一步!腾讯安全大数据实验室论文入选ACM CCS 2023

计算机领域国际权威学术顶会ACM CCS 2023于11月26日在丹麦哥本哈根开幕。腾讯安全大数据实验室团队论文《Hopper: Interpretative Fuzzing for Libraries》被大会收录&#xff0c;昨天&#xff0c;实验室研究员谢雨轩受邀出席大会进行主题分享。 该论文提出了解释性模糊测试&a…

前端笔试遇到的坑-100题

1.闭包 let 形成闭包 var全局变量 function test() {for (var i 0; i < 6; i) {console.log(i); //1 2 3 4 5 6// setTimeout(() > {// console.log(i);// }, 0); 6 6 6 6 6 6 6} } test();var array []; for (var i 0; i < 3; i) {array.push(() > i);…

全国高校走进深算院:共话国产数据库产教融合生态建设

近日&#xff0c;由教育部高等学校计算机类专业教学指导委员会、全国高等学校计算机教育研究会主办&#xff0c;清华大学出版社、深圳市信息技术应用创新联盟承办的“2023全国高校走进信创企业研学活动”顺利举办。来自全国各地30余家高校的近80位院校领导、教师代表走进了深圳…

WordPress更改文章分类插件

当WP网站内容比较多的时候&#xff0c;有时候如果涉及到批量修改文章分类&#xff0c;如果一个个的去操作的话就太费事了&#xff0c;如果使用后台批量修改分类的话是增加旧分类不会取消选择&#xff0c;就就导致我们适得其反还需要一个一个的去编辑取消&#xff0c;实在繁琐了…

年终好价节有什么必买的数码好物?值得入手的数码好物推荐

大家是不是都没听说过好价节&#xff1f;直白点说就是原来的双十二购物狂欢节&#xff0c;只不过换一个说法&#xff0c;不过今年毕竟是第一年换个说法&#xff0c;所以淘宝年终好价节优惠还是值得我们期待的&#xff01;作为年前的最后一波大促&#xff0c;一起来看看有哪些好…

redis 内存机制探索篇

info memory 查看redis 内存使用情况出现的问题&#xff0c;公司在导入大量redis key 的时候&#xff0c;想要看一下redis 内存使用情况 &#xff0c;发现used_memory_peak_perc 和 used_memory_dataset_perc 马上达到100%&#xff0c;这个时候很慌张&#xff0c;是不是当前red…

智能AI问答系统ChatGPT网站系统源码+Midjourney绘画+支持GPT-4-Turbo模型+支持GPT-4图片理解能力

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

亚马逊发布人工智能助手Amazon Q,一起来看看有什么功能

Amazon 在11.28日Re:Invent大会上推出人工智能助手Amazon Q&#xff0c;主要面向企业客户&#xff0c;提供个性化服务。号称是专为工作定制的生成式人工智能助手。Your generative Al-powered assistant tailored for work 核心能力企业知识库&#xff1a;为客户提供快速、相关…

低功耗蓝牙模块在医疗保健领域中的创新应用

医疗保健领域一直在追求更先进的技术&#xff0c;以提高医疗服务的效率和质量。低功耗蓝牙技术的崭新应用为医疗设备的互联性和数据传输提供了可靠的解决方案。本文将深入研究低功耗蓝牙模块在医疗保健领域中的应用&#xff0c;重点关注其在可穿戴设备、远程医疗监测和患者数据…