为什么重写equals时必须重写hashCode()

news2024/11/15 9:05:51

不重写equals和不重写 hashCode()之前:equals()比较的是对象的内存地址,hashCode()比较的其实也是内存地址(内存地址输入到哈希函数中得到的整数)

重写了之后,equals()比较的是对象的内容值,如果hashCode()不重写,还是比较地址的话,就会出现equals()认为两个对象相同,但是hashCode()认为两个对象不相同

我们希望的是equals()认为相同的两个对象,hashCode()结果是一样的。

首先equal()和hashCode()两个方法都是Object类中的方法,由于所有对象都继承了Object方法,所以所有类都有这两个方法

hashCode()方法:将对象的地址值映射为integer类型的哈希值

比如String类,如果重写equals方法,但是不重写hashCode()方法

String s1=new String("abc");

String s2=new String("abc");

 如果你调用s1.equals(s2) 返回的是True,但是s1对象和s2对象算出来的哈希值显然是不同的

也就是会产生:equals()方法认定相同的两个对象却有不同的哈希值的问题

我们希望equals()方法认定相同的对象有相同的哈希值

哈希值不等的两个对象一定不是同一个对象

哈希值相等的两个对象不一定是同一个对象,还要调用equals()方法,进一步判断这两个对象是不是同一个对象

当往HashMap中插入一条key-value时,其中key是一个String类对象,比如map("abc","test1")

判断key-value这个键值对的key这个对象是否存在,根据这个key求出哈希值,如果HashMap里面没有这个哈希值,说明HashMap里面没有这个对象,就可以存入这个key-value

如果已经有这个哈希值,就要调用equal方法,与已经存在的这个哈希值的key-value的key进行比较,如果判定两个key-value的key是同一对象,那就覆盖,不是同一对象就产生哈希冲突,挂在链表上或者红黑树上

下面这段代码中

        String s1=new String("abc");

        String s2=new String("abc");

        HashMap map=new HashMap();
        map.put(s1,"test1");
        map.put(s2,"test2");

        System.out.println(map.get(s1));//test2
        System.out.println(map.get(s2));//test2

 两个key-value的key对应的对象哈希值(对象地址输入到哈希函数中得到的整数)是一样,equals()方法判定两个对象也是一样的,所以会后者key-value覆盖前者的key-value

如果你重写了String类的equals方法,没有重写hashcode()方法,插入HashMap中第一步判断哈希值(因为不重写的话,哈希值就等于对象地址进行哈希运算得到的整数,地址不同,哈希值就不同)就不相等,那就会认为这是两条不同key-value,也就不会进行覆盖

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

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

相关文章

log是什么文件可以删除吗?log文件被删怎么恢复?

在工作和生活中,我们难免会遇到因操作失误、软件崩溃或病毒攻击等原因导致重要文件被误删的情况,这其中包括log文件。如果您不幸遇到log文件被误删的情况,不要过于担心,本文将为您介绍几种方法,帮助您找回被误删除的lo…

【hello Linux】动静态库

目录 1. 了解动静态库 1. ldd 命令的使用 2. C语言库与C语言库 3. 库的分类 4. 库的命名 5. 库的内容 2. 静态库的制作和使用 1. 静态库的制作 2. 静态库的使用 3.动态库的制作和使用 1. 动态库的制作 2. 动态库的使用 Linux🌷 1. 了解动静态库 1. ldd 命令的使用 …

JavaScript 鼠标事件监听触发时机触发顺序

有时间整理下鼠标的监听事件,目前汇总到的鼠标监听事件以下10个: 目录 1. click 2. dblclick 3.contextmenu 4.mousedown 5.mouseup 6.mouseenter 7.mouseleave 8.mouseover 9.mouseout 10.mousemove 先说下触发时机和作用键(左键…

九州云出席全球分布式云大会,基于5G MEC的车路协同创新引关注

4月20日,以“云智相生”为主题的2023全球分布式云大会北京站在北京成功召开。本次大会作为AIGC数智中国科技周的重要组成部分,聚焦分布式云和人工智能,探讨分布式云如何更好地支持人工智能发展,打造MaaS(模型即服务&am…

2023年4月中旬值得关注的几个AI模型:Dollly2、MiniGPT-4、LLaVA、DINOv2

AI模型的发展速度令人惊讶,几乎每天都会有新的模型发布。而2023年4月中旬也有很多新的模型发布,我们挑出几个重点给大家介绍一下。 Dolly-v2 MiniGPT-4 LLaVA DINOv2 Dolly-v2 Dolly是EleutherAI开源的一系列大语言模型,EleutherAI认为…

vue的diff算法原理

diff 概念diff比较流程头头尾尾头尾尾头比对查找过程 与vue3的区别 diff 概念 vue基于虚拟DOM做更新,diff的核心就是比较两个虚拟节点的差异。 vue的diff算法是平级比较,不考虑跨级比较的情况。内部采用深度递归 双指针的方式进行比较 diff比较流程 先…

文本挖掘 实践笔记

文本挖掘流程:(How) 文本预处理->特征提取->文本分析->可视化展示 文本预处理:包括文本清洗、分词、词性标注等 特征提取:将文本转化为词频、TF-IDF、embedding向量等 文本分析:利用统计学或机器学习的知识,做聚类、情感识别等 可视化展示:帮助人们更好…

Java版本电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标…

Pandas技术重点来了

Pandas库建立在NumPy之上,并为Python编程语言提供了易于使用的数据结构和数据分析工具。 1.安装及调用 pip install pandasimport pandas as pd 一种能够保存任何数据类型的一维标记数组 >>> s pd.Series([3, -5, 7, 4], index[a, b, c, d]) 一种具有潜…

第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结

第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结 目录 第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结引言~介绍一下cccc天梯赛(选读)开篇介绍(以下是个人经历部分的分享)赛前准备…

其他品牌的触控笔能用在ipad上?性价比高的触控笔合集

随着平板电脑在学校、办公室等领域的广泛应用,越来越多的人需要一支出色的电容笔。虽然苹果原装的电容笔很给力,但是其的价格实在是太贵了,仅仅把它用于在纸上写写字,实在是太可惜了。所以,哪个电容笔更便宜&#xff1…

密歇根大学Python系列之一:零基础 Python 入门

密歇根大学计算机专业注重将计算机科学理论与实践相结合,旨在帮助学生全面掌握计算机科学的基础理论和实践技能: 1.计算机程序设计:编程技能和常见编程语言,如C和Java和Python等; 2.数据结构和算法:数据结…

2023年能源与环境工程国际会议(CFEEE 2023)

会议简介 Brief Introduction 2023年能源与环境工程国际会议(CFEEE 2023) 会议时间:2023年9月1日-3日 召开地点:中国三亚 大会官网:CFEEE 2023-2023 International Conference on Frontiers of Energy and Environment Engineering 由三亚纵横…

手撕八大排序算法(解析源码+图解)

八大排序算法 文章目录 八大排序算法一、插入排序1.代码实现2.思路图解 二、希尔排序1.代码实现2.思路图解 三、选择排序(优化版)1.代码实现2.思路图解 四、堆排序1.代码实现2.思路图解 五、冒泡排序1.代码实现2.思路图解 六、快速排序1.递归版本2.非递归版本3.快速排序的两个优…

Android之 Bitmap使用

一,简介 1.1 Bitmap是一种图片在内存中的表现形式,不管是png,还是jpg最终都是以bitmap的形式显示到控件上面。 Bitmap是一种位图,位图​是点阵图像​或栅格图像,是由称作像素(图片元素)的单个…

C++篇----类、封装、类访问权限、类实例化

文章目录 一、面向过程和面向对象二、类 一、面向过程和面向对象 c语言是面向过程的编程语言 c是面向对象的编程语言 面向过程:关注过程,对于求解问题的不走,调用函数逐步解决问题 就洗衣服来说:洗衣服需要放水,倒洗衣…

PCL点云库(2) — IO模块

目录 2.1 IO模块接口 2.2 PCD数据读写 (1) PCD数据解析 (2)PCD文件读写示例 2.3 PLY数据读写 (1)PLY数据解析 (2)PLY文件读写示例 2.4 OBJ数据读写 (1&#xff…

QMS-云质说质量 - 10 我和我的客户投诉(2) - 客户逐利 驱除良币

云质QMS原创 转载请注明来源 作者:王洪石 上策伐谋 中策伐交 前面发过一篇关于客户投诉的文章“逢年过节要祈祷”,引起了很多质量人的共鸣,特别是汽车零部件行业曾经和正在负责客诉的质量同行们。 真实的产品质量问题,是否发生只…

Linux-初学者系列2——用户组管理和权限管理

用户组管理和权限管理 Linux-初学者系列2_用户组管理和权限管理一、所有者1、查看文件的所有者指令 2、修改文件所有者指令实操 二、组创建语法指令:实操: 三、所在组1、查看文件/目录所在组基本指令:实操: 2、修改文件所在组基本…

【读书笔记】高效能人士的7个习惯

高效能人士的7个习惯-史蒂芬柯维 个人成功1. 积极主动(BE PROACTIVE)2. 以终为始(BEGIN WITH THE END IN MIND)3. 要事第一(PUT FIRST THINGS FIRST)个人成功总结 集体成功4. 双赢思维(THINK WI…