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,一经查实,立即删除!

相关文章

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

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

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

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

OS复习——设备管理习题

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

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

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

软件测试——语句覆盖

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

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

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

csdn如何插入多列表格?

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

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

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

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

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

事务超时时间无效_什么是ZooKeeper?ZooKeeper分布式事务详解

前言zookeeper当初到底面临什么问题?而zookeeper又是如何解决这些问题的?实际上zookeeper主要就是解决分布式环境下的一致性问题。那么解决这个问题到底有哪些难点呢?我们一步一步来阐述和推理这个过程。分布式事务我们首先考虑一致性的特殊情…

MongoDB解决“Error parsing YAML config file: yaml-cpp: error at line 2, column value(安装服务)

解决“Error parsing YAML config file: yaml-cpp: error at line 2, column 13: illegal map value”(安装服务) 在安装 MongoDB服务中,我遇到以下报错: 解决: 于是我,我打开配置文件mongod.cfg&#x…

from mysql partition select_玩转select条件查询,避免踩坑

条件查询语法:select 列名 from 表名 where 列 运算符 值说明:注意关键字where,where后面跟上一个或者多个条件,条件是对前面数据的过滤,只有满足where后面条件的数据才会被返回。下面介绍常见的查询运算符。操作符描述…

Linux使用vi/vim打开文档/文件报错E325:ATTENTION Found a swap file by the name

重点:解决方法是: rm -rf .文件名.文件类型后缀.swp 如 rm -r .mongod.conf.swp 1、对于同一个文件如果上次已经打开,而未关闭的情况下,又打开该文件进行编辑时,会出现如下提醒: 这是由于已经打开但未闭关…

vue 怎么样不重复往数组里插入数据_前端数据结构与算法(1) -二分查找vs二叉树...

今天给大家开始介绍前端方面的数据结构,刚把vue源码过完就开始数据结构,可见它的地位有多重要。有人说我一前端又不是后端学这个数据结构干嘛,好吧,只能说你还没有这个意识,一是面试很多大厂就会考察,我面试…

MongoDB出错:ERROR: child process failed, exited with error number 1 To see additional infor

linux中安装mongoDB之后,启动不了,出现下边的错误,网上搜原因,很多说需要删除.lock文件,需要bin/mongod --repair修复,但是都不成功,最后发现是配置文件中路径问题。 [rootwqd mongodb]# bin/m…

js中立即执行函数会预编译吗_作为前端你了解JavaScript运行机制吗?

作为前端工程师,大家都知道js是前端一开始就要学会的知识点,js的代码你会写了,那js的运行机制你了解吗?只有了解了js的运行机制,才能在工作中如鱼得水,今天就跟随珠峰的老师一起来了解下js的运行机制吧。Ja…

nfine框架 上传文件_MVC之Struts2框架--你并不了解的高级应用

《“爱读书”--给你讲技术》,我来看书,你来进步,让我们开始吧!本书简介书名为《轻量级JavaEE企业应用实战》,是本人在学习JavaEE框架的时候阅读的第一本书,本书对于框架及相关基础知识讲述的比较详细和浅显…

阿里云服务器ping不通解决办法

阿里云服务器ping不通解决办法 阿里云服务器ping不通解决办法(云服务器搭建完环境访问不了ip解决办法) 问题:这里的服务器我以阿里云为例最近搞服务器,然后Ubuntu16.04下搭建LAMP环境后发现输入ip(http://1XX.XX.XX.…

java移动端接口测试_走进Java接口测试之测试框架TestNG数据驱动(入门篇)

前言我们在前面的文章中,和大家分享过接口自动化测试一些基本的实现方法,但是,你很快就会发现,如果在测试脚本中硬编码测试数据的话,测试脚本灵活性会非常低。而且,对于那些具有重复的请求,而只…

Windows更新右下角出现 天气温度等提示,如何取消

Windows更新后出现桌面下面出现 天气温度等提示,如何取消 解决:点击鼠标右键