必须掌握的hashcode()方法

2023-11-18

一、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方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

必须掌握的hashcode()方法 的相关文章

  • MQ手动推送消息

    1 根据topic找到你发送问题的消息 记录tag标签 key值 message消息主体 2 找到手动发送消息的位置 输入相应信息 注意需要编辑tag为当前时间 转载于 https www cnblogs com bubutianshu p

随机推荐

  • Java:那些把自己陷进去的误区(一)

    那些把自己陷进去的误区 1 1数据类型 1 整型 1 在Java中 整形的范围为 2147 483 648 2147483647 并且这个范围与运行Java代码的机器无关 此举大大解决了移植问题 2 Java没有任何无符合的数据类型的 un
  • 我刚刚作出了一个非常艰难的决定,还是把这个贴子发出来

    中国电力总公司 我们刚刚作出了一个非常艰难的决定 在腾讯和360停止互相争斗之前 我们决定将在装有QQ软件和360软件的电脑上停止供电 中国电力有幸能陪伴着您成长 未来日子 我们期待与您继续同行 微软中国 我们刚刚作出了一个非常艰难的决定
  • 714. 买卖股票的最佳时机含手续费

    给定一个整数数组 prices 其中第 i 个元素代表了第 i 天的股票价格 非负整数 fee 代表了交易股票的手续费用 你可以无限次地完成交易 但是你每笔交易都需要付手续费 如果你已经购买了一个股票 在卖出它之前你就不能再继续购买股票了
  • 2019年区块链教育培训课程研究报告

    前言 区块链教育培训机构可谓是区块链行业中的真正的 布道者 其课程内容主要有 技术培训 投资培训以及行业培训这三大类 课程内容主要的提供方可以分为 项目方 高校 常规教育机构以及新兴教育机构这四类 目前 较多的机构正在进行投资培训以及行业培
  • 黑圈数字符号0到50复制_带圆圈数字符号大全

    http www petroleumcloud cn pages 623 html 带圆圈数字符号一共有五种 其中包括一种中文数字符号 空心圆圈数字符号和实心黑圆圈数字分别有两种 只有一种圆圈数字符号能从0 50 其它的只有10个 复制 复
  • 华为OD机试题

    华为OD机试回顾 华为OD 机试题 Java实现 小镇做题家 做题记录 微信 yatesKumi 祖国西北部有一片大片荒地 其中零星的分布着一些湖泊 保护区 矿区 整体上常年光照良好 但是也有一些地区光照不太好 某电力公司希望在这里建设多个
  • LeetCode数据库题目汇总一(附答案)

    1 基础SQL 数据表 dept deptno primary key dname loc emp empno primary key ename job mgr references emp empno sal deptno refere
  • python numpy array 中删除含0量高于阈值的行--数据清洗

    问题 数据中包含较多0值 类似于包含较大噪声 对结果产生较大影响 目标 对数据进行清洗 在进行其他数据清洗操作的基础上 实现删除数据中包含较多0值的行 可类比推广到删除其他 代码实现 data data np sum data 0 axis
  • python中if __name__ == '__main__': 解析

    当你打开一个 py文件时 经常会在代码的最下面看到if name main 现在就来介 绍一下它的作用 模块是对象 并且所有的模块都有一个内置属性 name 一个模块的 name 的值取决于您如何应用模块 如果 import 一个模块 那么
  • java保留小数点的方式

    double型的 1 能四舍五入 System out printf 9 2f d 1 double d 114 145 2 d double Math round d 100 100 3 System out println d 2 Bi
  • PS2汉化2 - 自制程序的运行与调试

    自制程序的运行与调试 运行调试的坑点之类的 SDK 运行与调试 通过PS3 通过PS2 神 昂 奇 贵 的DTL 10000 贫穷者的零售机器 通过PCSX2仿真器 运行调试的坑点之类的 本文为了自制程序 或者修改后的某些程序 而撰写 记录
  • 第九章 tcp拥塞控制--基于Linux3.10

    下载地址 http download csdn net detail shichaog 8620701 Linux提供丰富的拥塞控制算法 这些算法包括Vegas Reno HSCTP High Speed TCP Westwood BIC
  • 【java筑基】IO流进阶之文件随机访问、序列化与反序列化

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 深入 全面 系统的介绍java的基础知识 文章简介 本文将深入全面介绍IO流知识 建议收藏备用 创作不易 敬请三连哦 大厂真题 大厂面试真题大全
  • unity中通过touch旋转、放大和缩小物体以及滑动方向的判断

    unity中通过touch旋转 放大和缩小物体以及滑动方向的判断这个需求在游戏开发中也是非常频繁 话不多说直接上代码 using System Collections using System Collections Generic usi
  • XSS详解

    XSS 伪装管理员登录后台 文章目录 XSS 伪装管理员登录后台 一 XSS注入原理 二 XSS危害 二 XSS分类 三 Cookie是什么 四 XSS获取cookie 一 XSS注入原理 XSS 攻击全称跨站脚本攻击 是为不和层叠样式表
  • [转]Unity Accelerator本地服务器加速Unity项目资源载入速度

    去年的时候项目引擎版本由2019升级为2020 对应的资源导入管线也由V1切换到了V2 在这个过程中发现原来的cachesever就不满足项目需要了 查阅了一些资料发现unity的cachesever升级成了Unity Accelerato
  • 警惕使用jvm参数CMSRefProcTaskProxy

    昨天中午的时候 团队的兄弟找我看一个现象 原先因为堆外内存使用过多会crash掉的java应用 设置了最大堆外内存量 MaxDirectMemorySize 后jvm不会crash 但出现了机器的两颗CPU全部被占满 而且java程序没有响
  • 【rust/egui】(九)使用painter绘制一些图形—基本使用

    说在前面 rust新手 egui没啥找到啥教程 这里自己记录下学习过程 环境 windows11 22H2 rust版本 rustc 1 71 1 egui版本 0 22 0 eframe版本 0 22 0 上一篇 这里 painter 定
  • Python数据分析小技巧:如何在Pandas中实现数据透视表?

    Python数据分析小技巧 如何在Pandas中实现数据透视表 数据透视表是数据分析中非常有用的工具 可以帮助我们快速了解数据的结构 关联和趋势 在Pandas中 我们可以使用pivot table 函数来实现数据透视表 例如 我们有一个销
  • 必须掌握的hashcode()方法

    一 hashcode是什么 1 hash和hash表是什么 想要知道这个hashcode 首先得知道hash 通过百度百科看一下 hash是一个函数 该函数中的实现就是一种算法 就是通过一系列的算法来得到一个hash值 这个时候 我们就需要