Java 中 == , equals 与 hashCode 的区别与联系

Java 中 hashCode 和 equals 方法是什么?它们与 == 操作符有什么区别? 哈希桶(Hash Bucket)是哈希表(Hash Table)中用来存储数据的一种结构。它是哈希表的核心组成部分,帮助解决哈希冲突问题。存储映射到相同哈希值的多个元素。每个哈希桶可以是一个简单的链表、数组、红黑树或其他数据结构,用来容纳冲突的元素。哈希桶通过哈希函数映射而成,数组的每个索引位置可以看作是一个桶。哈希桶是哈希表的基础单元,用于存储冲突的键值对。它通过链表、红黑树等结构解决了哈希冲突。Java 的HashMap利用哈希桶实现,结合链表和红黑树来优化性能。equals。 阅读详情

引言

关于 “==”、equals 和 hashCode,有时候不知道应该用哪个,感觉很多结果都是一样的,甚至乱用。为了以后不至于写错都不知到怎么错的,做一个笔记。

 

简述

==:比较两者之间的关系,这个关系在基本数据类型和引用类型变量中的比较有所差异。

equals:比较两对象的内容。

hashCode:比较对象在hash表中的位置。

 

" == "

1. 在基本数据类型(float、double、byte、short、int、long、char、boolean)中,由于JVM是直接存储的值,所以比较的是值。

2. 在引用类型变量中,JVM所存储的只是对象的引用,对象的创建会创建到堆内存中,所以比较的是内存地址是否相同。

JVM存储疑惑戳这里

 

equals

1. 由于equals()是Object的实例,则所有继承Object的类都会有这个方法。

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

2. 在各自的类中,equals()方法总会根据各自类的特征被重写以适应。

以被讲烂了的String.java为例:

1. 首先,在 if(this == anObject) 中,先对比了两个对象的引用地址,若相同,两对象肯定为同一个对象,所以直接返回true;

2. 走完第一步,就已确定是两个对象,但却不知道两对象是什么情况。然后在 if(anObject instanceof String) 判断传入的对象是否为String类型,这里因为以String为例,所以是String。其实就是判断两个对象类型是否相同,若不相同,连类型都不相同了,内容肯定不同,所以直接返回false;如果类型相同,则继续比较。

3. 因为我这源码是从 Android O 上摘的,不是很旧,这里中间又多了一步 if(n == anotherString.length()) 来先比较一下长度,长度不符合,直接返回false。添加这一个判断我感觉优化了很多,毕竟下面的操作要一点一点的内容做比较,比较耗资源,这样一来,有几率的提高了速度。

4. 最后就是比较内容了,相同为true,不同为false。

 

hashCode

1. 在说hashCode之前,应先了解下什么是hash?什么是hash表?

hash:是一个函数,这个函数里面有一系列的算法,然后通过这个函数所得到的一个值,这个值就是hash值。

hash表:顾名思义,由hash值所组成的表。

2. 什么是hashCode?

hashCode是通过hash函数得到的,表示在hash表中的位置。

3. hashCode != 对象的物理地址

hashCode:对象在hash表中的位置;

物理地址:对象存放在内存中的地址。

4. hashCode是怎样产生的?

现将对象的物理地址转化成一个整数,然后该整数通过hash函数的算法就得到了hashCode。

5. 为什么要用hashCode?

是为了查找的快捷,在散列存储结构中快速确定对象的存储地址。

假如说有一个集合{1,2,3,4,5,……98,99,100}。现在要放入一个数101,如果按遍历的方式,则需要挨个判断1~100个数是否其中有相同的数。

如果用hashCode:

假设这个表中有9个位置,则这个1~100的集合再假设这样放。

如果现在需要插入一个数,那么只要先查hashCode表中所对应的数,假设是1,则它只需要与HashCode表中位置为1的数做对比就可以了。

6. equals方法和hashCode关系?

如果两个对象equals相等,那么这两个对象的hashCode一定相同;

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

7. 重写equals方法时,需要重写hashCode方法吗?

如果重写了equals而未重写hashCode,可能会出现两个没有关系的对象equals相同,但hashCode确实不同。equals是根据对象的特征去重写,而hashCode没有被重写,这样就无法满足如果两个对象equals相等,那么这两个对象的hashCode一定相同。

所以重写equals方法时,重写hashCode方法。

 

参考文献

https://blog.youkuaiyun.com/justloveyou_/article/details/52464440

https://www.cnblogs.com/xudong-bupt/p/3960177.html

https://blog.youkuaiyun.com/qq_36522306/article/details/80550210

https://www.cnblogs.com/whgk/p/6071617.html

新手必看!Stata工具变量分析中的三大陷阱:如何正确解读LM统计量、CDW检验和Hansen J值 本文深度解析Stata工具变量分析中的三大核心检验:不可识别检验、弱IV检验和过度识别检验,帮助新手避开常见陷阱。详细解读LM统计量、CDW检验和Hansen J值的正确使用方法,提供实战案例和Stata操作指南,确保研究结论的可靠性。 阅读详情

相关推荐

手把手教你用FPGA驱动DAC8830:一个Verilog SPI驱动模块的完整实现与调试

本文详细介绍了如何使用FPGA通过Verilog实现DAC8830的SPI驱动模块,包括SPI通信机制解析、Verilog模块设计、代码优化及调试技巧。重点解决时钟同步、状态机设计等工程实践问题,适用于音频处理、仪器仪表等高精度数模转换场景。

weixin_26886855的博客 230

Java知识梳理—— ==,equal(),hashcode()的区别与联系

1.== 若操作数的类型是基本数据类型,则该关系操作符判断的是左右两边操作数的值是否相等 若操作数的类型是引用数据类型,则该关系操作符判断的是左右两边操作数的内存地址是否相同。也就是说,若此时返回true,则该操作符作用的一定是同一个对象。 int a=1; int b=1; System.out.println(a==b);//true ...

Slayer_Zhao的博客 362

UNSW-NB15数据集:网络流量分析与恶意攻击检测实战指南

本文提供了UNSW-NB15数据集在网络流量分析与恶意攻击检测领域的实战指南。详细介绍了该数据集的构成、核心特征解析、特征工程处理、机器学习模型训练与评估方法,并探讨了模型部署及持续优化的挑战与思路,帮助读者构建高效的网络攻击检测系统。

weixin_29193359的博客 259

Java中的==,equals与hashcode的区别和联系

1、概述 ==:该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系。 equals:Object 的 实例方法,比较两个对象的content是否相同。 hashCode:Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数。 2、关系操作符== 2.1、操作数的值 基本数据类型 在Java中有八种基本数据类型: 浮点型:float(4 byte), double(8 byte) 整型:byte(1 byte),

weixin_43181521的博客 375

别光看教程了!手把手带你用STM32F103C8T6最小系统板点亮第一个LED(附完整电路图)

本文详细介绍了如何使用STM32F103C8T6最小系统板点亮第一个LED,从硬件连接到软件开发环境搭建,再到编写和下载程序,手把手教你完成STM32入门的第一步。适合初学者快速上手STM32开发,附完整电路图和代码示例。

weixin_28678831的博客 196

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

yohnyang的博客 210

Java 中的 ==, equals 与 hashCode 的区别与联系

一. 关系操作符 ==: 若操作数的类型是基本数据类型,则该关系操作符判断的是左右两边操作数的值是否相等 若操作数的类型是引用数据类型,则该关系操作符判断的是左右两边操作数的内存地址是否相同。也就是说,若此时返回true,则该操作符作用的一定是同一个对象。 二. equals 方法: Java中所有的类都是继承与Object这个基类的,在Object类中定义了一个equals方法,这个方法的初...

illusory_germ的博客 361

复现:Mamba-UNet:降水临近预报的创新解决方案

Mamba-UNet通过其创新的双分支Mamba融合模块、多尺度时空注意力模块和动态分位数加权损失函数,在降水临近预报领域取得了显著的性能提升。它不仅在多种降水场景下表现出色,尤其在预测强降水事件方面展现出了强大的能力。这一创新模型为降水临近预报提供了一种新的解决方案,有望在未来的研究和应用中发挥更大的作用,为应对气候变化带来的挑战提供有力支持。随着技术的不断发展和优化,我们期待Mamba-UNet在更广泛的气象预报任务中发挥更大的价值,为各行各业提供更精准、更可靠的降水预报服务。

hanfeng5268的博客 915

java中==和equals和hashCode的区别

1、== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型         byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值。  2.引用类型(类、接口、数组)         当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出...

u013025649的专栏 1万+

2023,程序员的出路在哪里?

可是似乎从30岁开始这工资就没涨过,前面跳槽几次涨的薪水在30岁以后跳槽已经不管用了、定格了,这几年由于市场环境不景气,程序员竞争越来越激烈,36岁跟30拿的工资一模一样,不仅工资拿的一样,反而事情还越来越多了,这些都意味着什么?处理故障需要的通常不仅仅是写代码的能力,还需要对一个系统的全貌要有一定的掌握。虽然目前不少大型互联网企业都在进行结构性调整,但是从互联网行业发展的基本面来看,未来在产业互联网发展的过程中,IT行业和传统行业将会释放出大量的就业岗位,所以未来程序员的发展空间还是非常值得期待的。

AI天才研究院 20万+

FPGA实现串口的任意字节数接收

基于FPGA的任意字节数(单字节、多字节)的串口(UART)接收,真的不来看看吗?

孤独的单刀 1万+

JAVA之==与equals,equals与hashcode区别与联系

1."=="与equals的区别与联系 (1)“==”对于基本数据类型,只要值相等,就返回true,否则返回false。 若比较的为对象,则判断的是两个对象是否处于同一个内存地址。 (2)equals为Object类中的方法,Object中equals默认使用==来判断,因此一般来讲equals与“==”并无区别,完全相同。 Object是所有类的父类,在不少类中都对equals进行了重写,比如最常用的String类,因此在String中比较的是值,而非地址。 ...

老布丁的博客 1118

B07:AI 时代怎么考核团队?我把 KPI 改了 5 版才找到答案

最后说一句掏心窝的话。绩效考核不是"管人"的工具,是"引导团队行为"的工具。你定什么指标,团队就会做什么行为。你定"AI 占比",团队就凑占比你定"效率提升",团队就挑软柿子你定"代码行数",团队就刷行数你定"工具使用率",团队就刷使用只有定"业务价值 + 工程质量 + 能力成长"三个维度的指标,团队才会真正关注长期价值。这套 KPI,我在我带的团队里跑了 6 个月,没有任何一个指标被"刷"出来。考核的是结果,不是过程。永远考核"创造了多少价值",永远不考核"用了多少 AI"。

刘一说的IT专栏 503

Java的==与equals区别,hashCode 与 equals

推荐阅读:Java hashCode() 和 equals()的若干问题解答 - 如果天空不死 - 博客园 文章目录一、==与equals区别二、hashCode 与 equals1、hashCode()介绍2、hashCode()与 equals()的相关规定 一、==与equals区别 1、== == : 它的作⽤是判断两个对象的地址是不是相等。即,判断两个对象是不是同⼀个对象。 1)基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。 2)引用数据类型:比较

H.千面的博客 280

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java中==和equals的区别,equals和hashCode的区别

==是运算符,用于比较两个变量是否相等。 equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样。Object的equals方法如下: public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法。返回一个离散的int型整数。在机会类操作中使用,为了提高查询速度。(HashMap,Has

天天的专栏 4万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java中equals,hashcode和==的区别

1、== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值。  2.引用类型(类、接口、数组)    当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结

爱上在路上 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java == hashcode,java中==和equals和hashCode的区别

java中==和equals和hashCode的区别== 的作用:基本类型:比较的就是值是否相同引用类型:比较的就是地址值是否相同(确切的说,是堆内存地址)equals 的作用:引用类型:默认情况下,比较的是地址值。public boolean equals(Object anObject) {2 if (this == anObject) {3 retur...

weixin_32187691的博客 201

java 中==和equals 和hashCode 的区别

1)== 若是基本数据类型比较,是比较值,若是引用类型,则比较的是他们在内存中的存放地址。对象是存放在堆中,栈中存放的对象的引用,所以 == 是对栈中的值进行比较,若返回true 代表变量的内存地址相等; 2)equals 是Object 类中的方法,Object 类的equals 方法用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。若是类中覆盖了equals 方法,就要根据具体代码来确定,一般覆盖后都是通过对象的内容是否相等来判断对象是否相等。 3)hashCode()计算出对象实例

siyuanwai的博客 507

【Java 每日一练 - Day2】== 和 equals 的区别?hashCode 和 equals 的关系?

HashMap 中会把 p1 和 p2 视为两个不同的 key,导致数据查询异常,违背 “相同内容的对象应作为同一个键” 的预期。:String、StringBuffer、StringBuilder 的区别?面试中如何回答性能对比和适用场景?(提示:intern () 方法会将字符串存入常量池,返回常量池中的引用)评论区留下你的答案:以下代码输出什么?

Xiong_Ji537的博客 646

Java hashCode() 和 equals()和==的区别于联系

文章目录一、“==”与equals()的区别二、hashCode()的作用三、hashCode() 和 equals() 的关系 一、“==”与equals()的区别 == : 它的作⽤是判断两个对象的地址是不是相等。即判断两个对象是不是同⼀个对象(基本数据类型==⽐的是值,引⽤数据类型⽐的是内存地址)。 equals() : 它的作⽤也是判断两个对象是否相等。但它⼀般有两种使⽤情况: 情况 1:类没有重写 equals() ⽅法。则通过 equals() ⽐较该类的两个对象时,等价于通过“=

pp1981002445的博客 158

Java中的hashCode()和equals()方法,它们与 == 操作符有什么区别?

或者。

apple_64847327的博客 1841

【搞定Java基础】第8篇:Java 中的 == 、equals 、hashCode 的区别与联系

本文转发自:Java 中的 ==, equals 与 hashCode 的区别与联系 本文目录: 一、概述 二、关系操作符 == 三、equals 方法 四、hashCode 方法 五、小结 这里再推荐阅读另外一篇文章:重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源 一、概述 1、概念 1、== : 该操作符生成的是一...

Java学习 328
上一篇: Java虚拟机 之 内存区域
下一篇: Java虚拟机 之 对象
Seas.Su
博客等级 码龄9年 19粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值