hashcode、equals

一、hashcode是什么?

1、hash和hash表是什么?

想要知道这个hashcode,首先得知道hash,通过百度百科看一下
在这里插入图片描述在这里插入图片描述

hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值,这个时候,我们就需要知道另一个东西,hash表,通过hash算法得到的hash值就在这张hash表中,也就是说,hash表就是所有的hash值组成的,有很多种hash函数,也就代表着有很多种算法得到hash值,如上面截图的三种,等会我们就拿第一种来说。

2、hashcode

有了前面的基础,这里讲解就简单了,hashcode就是通过hash函数得来的,通俗的说,就是通过某一种算法得到的,hashcode就是在hash表中有对应的位置。

每个对象都有hashcode,对象的hashcode怎么得来的呢?

首先一个对象肯定有物理地址,在别的博文中会hashcode说成是代表对象的地址,这里肯定会让读者形成误区,对象的物理地址跟这个hashcode地址不一样,hashcode代表对象的地址说的是对象在hash表中的位置,物理地址说的对象存放在内存中的地址,那么对象如何得到hashcode呢?通过对象的内部地址(也就是物理地址)转换成一个整数,然后该整数通过hash函数的算法就得到了hashcode,所以,hashcode是什么呢?就是在hash表中对应的位置。这里如果还不是很清楚的话,举个例子,hash表中有 hashcode为1、hashcode为2、(…)3、4、5、6、7、8这样八个位置,有一个对象A,A的物理地址转换为一个整数17(这是假如),就通过直接取余算法,17%8=1,那么A的hashcode就为1,且A就在hash表中1的位置。肯定会有其他疑问,接着看下面,这里只是举个例子来让你们知道什么是hashcode的意义。

二、hashcode有什么作用呢?

前面说了这么多关于hash函数,和hashcode是怎么得来的,还有hashcode对应的是hash表中的位置,可能大家就有疑问,为什么hashcode不直接写物理地址呢,还要另外用一张hash表来代表对象的地址?接下来就告诉你hashcode的作用,

1、HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的(后半句说的用hashcode来代表对象就是在hash表中的位置)

为什么hashcode就查找的更快,比如:我们有一个能存放1000个数这样大的内存中,在其中要存放1000个不一样的数字,用最笨的方法,就是存一个数字,就遍历一遍,看有没有相同得数,当存了900个数字,开始存901个数字的时候,就需要跟900个数字进行对比,这样就很麻烦,很是消耗时间,用hashcode来记录对象的位置,来看一下。hash表中有1、2、3、4、5、6、7、8个位置,存第一个数,hashcode为1,该数就放在hash表中1的位置,存到100个数字,hash表中8个位置会有很多数字了,1中可能有20个数字,存101个数字时,他先查hashcode值对应的位置,假设为1,那么就有20个数字和他的hashcode相同,他只需要跟这20个数字相比较(equals),如果每一个相同,那么就放在1这个位置,这样比较的次数就少了很多,实际上hash表中有很多位置,这里只是举例只有8个,所以比较的次数会让你觉得也挺多的,实际上,如果hash表很大,那么比较的次数就很少很少了。 通过对原始方法和使用hashcode方法进行对比,我们就知道了hashcode的作用,并且为什么要使用hashcode了

三、equals方法和hashcode的关系?

通过前面这个例子,大概可以知道,先通过hashcode来比较,如果hashcode相等,那么就用equals方法来比较两个对象是否相等,用个例子说明:上面说的hash表中的8个位置,就好比8个桶,每个桶里能装很多的对象,对象A通过hash函数算法得到将它放到1号桶中,当然肯定有别的对象也会放到1号桶中,如果对象B也通过算法分到了1号桶,那么它如何识别桶中其他对象是否和它一样呢,这时候就需要equals方法来进行筛选了。

1、如果两个对象equals相等,那么这两个对象的HashCode一定也相同

2、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置

这两条你们就能够理解了。

四、为什么equals方法重写的话,建议也一起重写hashcode方法?

(如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写)

举个例子,其实就明白了这个道理,

比如:有个A类重写了equals方法,但是没有重写hashCode方法,看输出结果,对象a1和对象a2使用equals方法相等,按照上面的hashcode的用法,那么他们两个的hashcode肯定相等,但是这里由于没重写hashcode方法,他们两个hashcode并不一样,所以,我们在重写了equals方法后,尽量也重写了hashcode方法,通过一定的算法,使他们在equals相等时,也会有相同的hashcode值。

在这里插入图片描述

实例:现在来看一下String的源码中的equals方法和hashcode方法。这个类就重写了这两个方法,现在为什么需要重写这两个方法了吧?

equals方法:其实跟我上面写的那个例子是一样的原理,所以通过源码又知道了String的equals方法验证的是两个字符串的值是否一样。还有Double类也重写了这些方法。很多类有比较这类的,都重写了这两个方法,因为在所有类的父类Object中。equals的功能就是 ==号的功能。你们还可以比较String对象的equals和==的区别啦。这里不再说明。

在这里插入图片描述
hashcode方法

在这里插入图片描述

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

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

相关文章

科研工作者结合实验与计算机模拟,理论物理前沿重点实验室

中国科学院理论物理前沿重点实验室理论物理前沿重点实验室属于基础理论类实验室。实验室定位为:依托理论物理研究所,面向科学前沿,面向国家大科学工程,坚持“开放、流动、竞争、联合”,联合全国理论物理学工作者&#…

poi 不自动计算 设置单元格公式_Java POI:如何读取Excel单元格的值而不是计算公式?...

上面的建议对我来说不起作用cell.getRawValue()返回与AUT上的excel单元格相同的公式,所以写下面的函数,它工作:public void readFormula() throws IOException {FileInputStream fis new FileInputStream("Path of your file");Wo…

word怎么设置页码为第几页共几页

1.首先在WORD文档中编辑好你的文档内容; 2.点击插入中的页眉(或页脚),选择“空白内容”,出现[在此处键入]。如下面图片所示内容; 3.在[在此处键入]中输入第页,共页;([]…

哈师大计算机大一上学期课表,哈尔滨师范大学课程表.doc

文档介绍:哈尔滨师范大学课程表社会与历史学院历史学专业 2009级 1 班 131 人 2013年2月27日施行科目课教师节教星期室上午下午第一节第二节第三节第四节第五节第六节第七节第八节第九节第十节星期一古代东方文明王鹤—副教授人520文革研究郑文云—副教授人520星期二…

ethercat转profinet网关_Profinet与EtherCAT网关使用方法

所谓的网关通俗来讲就是一种“协议转换器”,它能够将一种通信协议转换到另一种通信协议,满足实际应用中对通信的需求,从而实现投资保护的作用。Hongke Gateway模块化网关提供了一种很好的方式来快速、轻松以及经济高效的连接不同的网络&#…

Tue Jun 15 16:18:44 CST 2021 There was an unexpected error (type=Bad Request, status=400). Validatio

异常: 原因:点击链接,链接后边的参数值为null,controller中接受的对象不能接受到 id的值为null,不能封装到对象中 解决:

二级计算机access押题,全国计算机等级考试标准教程:二级Access

全国计算机等级考试标准教程:二级Access语音编辑锁定讨论上传视频《全国计算机等级考试标准教程二级Access》是2011年电子工业出版社出版的图书,作者是蒋贤维等。本书主要介绍了全国计算机等级考试二级Access的基本内容和规律技巧。书 名全国计算机等…

pythonmulti函数_python – 用于使用MultiIndex创建pandas系列的语法糖

对我来说似乎很好.您可以使用itertools.product创建元组,而不包含理解中的三个部分.但我认为这对于初学者来说同样是好的并且可读,而使用itertools的方法则不那么容易. itertools的方式是这样的:list(itertools.product(range(2),range(number_of_classes),range(nu…

OS复习——设备管理习题

OS复习——设备管理习题 在I/O系统中引入缓冲的主要原因是什么?某文件占10个磁盘块,现要把该文件的磁盘块逐个读入主存缓冲区,并送用户区进行分析。一个缓冲区与磁盘块大小相等。把一个磁盘块读入缓冲区的时间为100μs,缓冲区数据…

职中心得体会300字高一计算机,职业高中毕业的自我鉴定范文300字

职业高中毕业的自我鉴定范文300字自我鉴定就是把一个时段的个人情况进行一次全面系统的总结,自我鉴定可以让我们对自己有个正确的认知,不如立即行动起来写一份自我鉴定吧。我们该怎么去写自我鉴定呢?下面是小编精心整理的职业高中毕业的自我鉴…

navicat怎么查看数据库的url_连接数据库url怎么写

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

软件测试——语句覆盖

语句覆盖 一、定义: 程序中每一个语句至少能被执行一次 二、特点: 1、程序中每一个语句执行一次 2、对程序执行逻辑的覆盖率低,属于最弱的覆盖方式 3、无需测试程序的分支情况 4、无需测试程序分支判断的输入值以及输入值的组合 5、无需测试…

网络服务器最基本的是文件,你可能想知道的15个网络常用基础知识

原标题:你可能想知道的15个网络常用基础知识网络是一个复杂的系统,涉及知识很多。现在腾正小超人给大家分享15个常用的网络基础知识:1) 如何查看本机所开端口用netstat -a —n命令查看!再stat下面有一些英文,我来简单说一下这些英…

python3获取当前日期_如何在python3中获取当前日期和时间? – Python3教程

在本文中,你将学习如何用Python获取今天的日期和当前的日期和时间,我们还将使用strftime()方法以不同的格式格式化日期和时间。获取当前日期的方法有很多,我们将使用datetime模块的date类来完成这项任务。例1:Python获取今天的日期…

csdn如何插入多列表格?

csdn如何插入多列表格? 问题:点击插入表格只能插入两列 问题效果图: 如果我们想插入自己想要的表格效果该如何处理呢?首先可以百度Markdown 编辑器语法进行相关研究(由于自己基础薄弱,所以我就偷个懒&am…

反编译后怎么修改服务器地址,反编译后怎么修改服务器地址

反编译后怎么修改服务器地址 内容精选换一换业务接入DDoS高防后,经过高防转发的流量到服务端之后真实源IP将被隐藏,在业务应用开发中,通常需要获取客户端真实的IP地址。例如,投票系统为了防止刷票,需要通过获取客户端真…

丁向荣单片机pdf_单片机应用系统与开发技术项目教程 丁向荣 9787302445135

项目一 单片机及单片机应用系统认知任务1 单片机简介任务2 单片机应用系统的虚拟仿真习题项目二 单片机应用系统的开发工具任务1 单片机应用系统的硬件开发平台任务2 Keil C集成开发环境的操作使用任务3 STC单片机应用程序的在线编程与在线调试任务4 STC单片机应用程序的在线仿…

mongodb 配置文件

一.说明 配置mongodb有两种方式,一种是通过mongod和mongos两个命令;另外一种方式就是配置文件的方式。因为更容易去管理,所以后者更受大家的青睐。 二. 配置文件格式 mongodb 配置文件采用的YAML格式; 例如: systemLog:desti…

微信小程序服务器域名修改生效时间,微信小程序修改request合法域名不生效及解决方法...

界面设计技法之css布局css布局之于页面就如同ECMAScript之于JS一般,细想一番,html就如同语文,css就如同数学,js呢,就是物理,有些扯远,这里就先不展开了. 回到主题,从最开始的css到如今的sass(l ...作业七:团队项目——Alpha版本冲刺阶段-11部分功能实现: public voi…

五行塔怎么吃第五个_中医美容——“五行美容养颜法”,善用五行,女人会越来越漂亮...

人天生体质强人不同,俗话说“有人怎么吃都不胖,有人只喝水也长肉”,这说的就是体质不同,生活环境不同,饮食习惯不同。从中医的角度来讲,每个人都有属于自己的五行属性。这种属性深深的影响着你的身体器官、…