HashCode

article/2025/9/30 4:50:27

HashCode

文章目录

  • HashCode
  • 前言
  • Hash是什么?
  • HashCode
    • HashCode关键点
    • 判断两个对象相等

前言

Hash是什么?

哈希函数
把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值,是一种压缩映射。

hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值。hash表,通过hash算法得到的hash值存在hash表中,也就是说,hash表就是所有的hash值组成的,hash函数可以有很多种,只要能实现得到的每一个值不重复就可以。

Hash函数特性
h(k1)≠h(k2)则k1≠k2,即散列值不相同,则输入值即预映射不同
如果k1≠k2,h(k1)=h(k2) 则发生碰撞;
如果h(k1)=h(k2),k1不一定等于k2;

Hash的使用场景
什么时候使用hash函数?
如果从互联网下载一个文件,文件的下载过程中会经过很多网络服务器、路由器的中转,如何保证这个文件就是我们所需要的呢?不可以通过文件名,文件大小,文件类型这些容易被伪装的信息来判断,因为在传输的过程中这些信息很容易被修改和伪造。此时可以用hash算法来进行加密。通过hash算法对文件计算得到一个值,在本地在运用hash算法将这个值解析出来,如果文件被修改过,得到的值会不一样从而对文件进行加密保护。

HashCode

每个对象都可以计算hashcode,首先一个对象肯定有物理地址,将对象的物理地址转换成一个整数,然后该整数通过hash函数的算法就得到了hashcode,hashcode就是在hash表中对应的位置。

物理地址指对象存放在内存中的地址hashcode代表对象的地址在hash表中的位置

例:有一个hash表,表中有 hashcode为1、hashcode为2…hashcode为5这样5个位置,有一个对象A,假设A的物理地址转化为整数是17,通过特定的hash函数算出来的hashcode值为2(假设用物理地址%5来计算hashcode),则对象A应该在hash表中的2的位置。如果有一个对象B,算出来的hashcode值为3,则B应该在hashcode表中3的位置。如果有一个对象C,他计算出来的hashcode也等于2,则证明C和A的物理地址是一样的(假设hash函数正确,既不同的x值算出来的h(x)不同),则对象C和对象A应该是相等的。

HashCode关键点

1、HashCode的存在主要是为了查找的快捷性,hashcode是用来在散列存储结构中确定对象的存储地址的,通过hash函数可以快速的确定一个对象的物理地址。

2、如果两个对象equals相等,那么这两个对象的hashcode一定也相同,既equals相等,则物理地址相同,则计算出来的hashcode也一定相同。

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

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

判断两个对象相等

常用的.equals()去判断两个对象是否相等是需要重写equals方法的,重写equals方法时应该也尽量重写hashcode()方法。

例子:定义一个用户类,包含属性ID、name和age

public class Users {int id;String name;int age;public Users() {}public Users(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}
}

在主函数中创建两个对象user1和user2,直接调用java自带的.equals()方法去比较:

public class Test {public static void main(String[] args) {Users user1=new Users(3,"John",5);Users user2=new Users(3,"John",5);if(user1.equals(user2)){System.out.println("相同");}else{System.out.println("不相同");}}
}

得到的结果为不相同,这是因为此时没有重写equals方法,用的是java本身的方法,可以看到它比较的是地址,因为两个对象都是new出来的所以地址是不一样的。
java中自带的equals方法:

public boolean equals(Object obj) {return (this == obj);}

这样是没有错误的,但是如果我们在实际运用中想让地址不同但是id,name,age都相同的两个对象相等怎么办,这时就需要重写equals方法,在Users类中重写equals方法:

 @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Users users = (Users) o;return age == users.age && Objects.equals(id, users.id) && Objects.equals(name, users.name);}

可以看到在重写的equals方法中,首先用==比较的是两个对象的物理地址,如果物理地址相同则两个对象一定相同。然后判断输入的对象是不是为空或者两个对象的类型不一样,如果不一样直接返回false。然后去比较两个对象上的属性是不是一样,如果属性都一样就返回相同。
此时在运行main函数可以看到结果为相同。因为重写了equals方法,虽然两个对象的物理地址不同但是是根据实际需求将id,name,age相同的两个对象判断为相等。

同理,对hashcode也是一样的,如果不重写hashcode,则此时的user1和user2用hashcode判断时还是会得到不相同的结果。此时就需要重写hashcode方法:

@Overridepublic int hashCode() {return Objects.hash(id, name, age);}

此时使用对象的所有属性id,name和age去计算hashcode,得到的结果一定是一样的,则会判断user1和user2相同。

为什么要重写hashcode:
前面已经讲过,如果判定两个对象equals,则他们的hashcode也一定要相同,这样就可以方便的进行存储和提升查找效率,比如user1和user2属性都一样,则他们判定为equals,此时可以只用一个地址去存储这个user对象,调用的时候得到的属性是一样的,这样就必须要求他们得到的hashcode值一样。如果不重写hashcode方法,运用java自带的方式得到的结果是不一样的,所以要重写hashcode方式使不同地址的但属性一样的两个对象hashcode也相等,他们在hash表中的位置一样。

不重写hashcode属性相同地址不同的两个对象方法得到的hashcode值:
在这里插入图片描述
重写hashcode方法以后属性相同地址不同的两个对象得到的结果:
在这里插入图片描述
可以看到两个user对象的hashcode值是一样的,这样就可以在hash表中放在同一位置,需要这个属性的user时就可以快速的通过hashcode找到地址并调用。

注意如果两个对象的hashcode相同不代表他们是equals的,不同的对象可能会生成相同的hashcode值,因为这只是说他们在hash表中的位置是相同的,要通过equals去判断是否相等。。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。

也就是说对于两个对象,如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等;
如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同;
如果两个对象的hashcode值不等,则equals方法得到的结果必定为false;
如果两个对象的hashcode值相等,则equals方法得到的结果未知。


http://chatgpt.dhexx.cn/article/WsZIewR6.shtml

相关文章

java中equals,hashcode和==的区别

2019独角兽企业重金招聘Python工程师标准>>> 1、== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。 2.引用类型(类、接口、数组) 当…

hashcode讲解【最详细版本】

Object 基类 Object 含有的方法 hashCode 作用:用于查找的快捷性,常用于确定对象的存储地址 如 Hashtable,HashMap 默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。 如果两个对象相同, equals方法一…

hashcode详解

前言 HashCode是在Java中用于获取对象的唯一标识符的方法。它是根据对象的内容生成的一个整数值。对象的hashCode()方法被调用时,它返回的是对象的哈希码。哈希码可以用于在哈希表等数据结构中快速定位对象。 在Java中,hashCode()方法是被Object类定义…

真正搞懂hashCode和hash算法

本人当初刚接触java的时候一说到hash算法或者hashCode也是蛋蛋疼,两只都疼 后来花了整整一天时间来研究hash,搞懂后发现其实也不难理解,时隔一年突然想起来,写篇博客记录下; 以前我莫得选择,现在我想搞懂…

腾讯_TEG一面

总结 不愧是腾讯内部技术含量较高的部门,上来怼基础。总体有套路可循,比较偏技术

腾讯技术解读|TEG—硬核拆解,腾讯产品的底层技术牛在哪里?

技术,是各个事业群的核心力量 然而,事业群的不同,核心力量也不同 你是否还在纠结事业群的选择? 担心对事业群不了解而选错事业群? 毫无疑问 技术也是事业群选择的重要衡量因素之一哦! 对此&#xff0c…

15 年腾讯老兵谈技术人成长之路

作者:alexguo,腾讯TEG技术总监&技术专家 每个职场人都会经历从职场新人到骨干、专家亦或是管理者的蜕变过程。作为技术职业人,大家常会碰到一些困惑,在不同职业发展阶段所需要具备的认知和专业能力差异在哪里?除了…

腾讯TEG客户端开发面经

2022年秋招/春招/提前批/大厂面经整理(持续更新中~) 腾讯TEG客户端开发面经 2021/05/19下午两点半初试 1、面试官先让做自我介绍,主要介绍项目,简短一点不需要太详细。 ------我大概讲了一下我的三个项目,第一个是高…

腾讯TEG首次集体亮相腾讯全球数字生态大会,这些亮点不容错过!

5月21日—23日,腾讯全球数字生态大会将在昆明滇池国际会展中心召开。大会是将腾讯过往的三大峰会“腾讯全球合作伙伴大会”、“腾讯云未来峰会”和“互联网数字经济峰会”进行有机整合,届时,众多行业领袖、技术领军人物、国际知名数字经济研究…

粉丝投稿!大三参加校招三面腾讯TEG实习岗面经分享,希望对大家有帮助!(已拿意向书)

背景介绍 背景:本科大三,末流211,计科专业,寒假在某bat一家实习 腾讯流程好快,从面到结束一周拿意向书,3.18开始一面,3.25拿到意向书 一面 75min 自我介绍学校做的项目有没有什么优点&#x…

TEG《选择》乘风破浪 · 披荆斩棘

等灯等灯~ 今夜,TEG《选择》在新年晚会闪亮登场 听说有人夸我们大歌舞大排面(蟹蟹) 其实咱剧情还搭载着回忆与梦境、理想与现实 来,他二哥就好好跟大家唠嗑唠嗑这《选择》 选择音乐剧 几句话概括我们的故事主线&#x…

什么是IEGT?

1980年前后,通用公司的B•贾扬•巴利加发明了IGBT,解决了当时MOSFET和普通双极功率晶体管无法解决的问题。但随着产品的发展,大家发现了这种新型器件拥有静态损耗的问题。于是东芝半导体的工程师就在上个世纪九十年代率先实现了栅极注入增强&…

关于【腾讯 TEG云架构平台部( 云架平) 存储组】

这算是个简单的辟谣帖吧 本人21届新人,入职快半年了,之前也在这边实习过半年,几乎不怎么看脉脉,但最近看到一些黑帖,本不想回复,但是考虑到自己也是应届生过来的,刚拿到offer肯定忍不住想从各方…

Carla自动驾驶仿真三:Traffic Manager交通管理器详解

CARLA Traffic Manager 一、什么是Traffic Manager1、Traffic Manager简介2、Traffic Manager框架3、Traffic Manager模块 二、Traffic Manager控制方法1、TM控制交通参与者的自动驾驶的规则2、TM控制交通参与者行为的API摘要3、TM控制交通参与者行为的API 三、Traffic Manager…

[carla入门教程]-5 使用ROS与carla通信

本专栏教程将记录从安装carla到调用carla的pythonAPI进行车辆操控并采集数据的全流程,带领大家从安装carla开始,到最终能够熟练使用carla仿真环境进行传感器数据采集和车辆控制. 第五节 使用ros与carla通信 本小节的主要内容是介绍carla中的如何使用ros进行通信. 章节内容介…

CARLA安装记录(二)

安装好显卡驱动后,接下来的步骤是安装Unreal Engine。我的操作系统是Ubuntu 18.04 系统要求 Ubuntu 18.04。CARLA兼容Ubuntu 16.04及之前版本,但虚幻引擎正常工作需要合适的编译器。至少130GB磁盘空间。CARLA会占用大约31GB的空间,而虚幻引…

Carla安装记录

Carla安装记录 最近打算在做一些自动驾驶相关的东西,所以安装了一下Carla。在这里记录一些自己的安装过程中遇到的一些问题和解决的方法。 Carla release版本下载 想要安装Carla,可以选择release版本或者源码安装。在这里我主要介绍release版本的安装…

Carla中实现车辆轨迹获得

Carla中实现车辆循迹及车道保持(使用MPC和强化学习) 需要用到的 python apicarla.mapmethods一个简单的方法实现路径规划 carla.Waypointmethods carla.DebugHelpercarla.World 强化学习部分方法自动驾驶综述实验结果 模仿学习(Imitation Lea…

Carla学习(五) Carla常用传感器

Depth camera,输出carla.Image,深度相机使用三通道RGB值存储距离信息,然后将其转换为距离灰度图: normalized (R G * 256 B * 256 * 256) / (256 * 256 * 256 - 1) in_meters 1000 * normalized传感器数据包含: frame&#…

Carla传感器

1.介绍 Carla中传感器类别多种多样,不同传感器数据之间也存在差异。但是传感器的使用方法之间存在一致性。本文介绍Carla中传感器使用的通用方法。有关传感器的描述可以在carla.Sensor类中查看 2. 传感器的通用方法 在介绍传感器的通用方法之前,需要明…