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

DSPTMS320F28335入门 结构体是一种复合数据类型,它定义的变量中有三种不同性质的元素,它和其他的基本数据类型功能是一样的。是一个结构体类型,追进去如下:可以看到,该结构体表示了GPIO0~GPIO15,且内部用了C语言中【位域】的语法,每2bit表示一个GPIO,所以一个32bit寄存器可以表示16个GPIO口。结构体是用.来完成访问的,所以一级一级追下来,可以发现GPIO7,就属于A组的GPIO,因为2bit表示一个GPIO,所以一个32bit的寄存器只能表示16个GPIO,所以只能表示到GPIO0~GPIO15。 阅读详情

在java中:

==是运算符,用于比较两个变量是否相等。

equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样。Object的equals方法如下:

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

hashCode也是Object类的一个方法。返回一个离散的int型整数。在集合类操作中使用,为了提高查询速度。(HashMap,HashSet等)


有了这三个基础概念,区别就简单了。网上有很多,汇总一下:

java中的数据类型,可分为两类: 
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 
  他们之间的比较,应用双等号(==),比较的是他们的值。 
2.复合数据类型(类) 
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
  对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。


如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。
如果两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果

从而在集合操作的时候有如下规则:

将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。

回过来说get的时候,HashMap也先调key.hashCode()算出数组下标,然后看equals如果是true就是找到了,所以就涉及了equals。



《Effective Java》书中有两条是关于equals和hashCode的:

覆盖equals时需要遵守的通用约定: 
  覆盖equals方法看起来似乎很简单,但是如果覆盖不当会导致错误,并且后果相当严重。《Effective Java》一书中提到“最容易避免这类问题的办法就是不覆盖equals方法”,这句话貌似很搞笑,其实想想也不无道理,其实在这种情况下,类的每个实例都只与它自身相等。如果满足了以下任何一个条件,这就正是所期望的结果: 
类的每个实例本质上都是唯一的。对于代表活动实体而不是值的类来说却是如此,例如Thread。Object提供的equals实现对于这些类来说正是正确的行为。
不关心类是否提供了“逻辑相等”的测试功能。假如Random覆盖了equals,以检查两个Random实例是否产生相同的随机数序列,但是设计者并不认为客户需要或者期望这样的功能。在这样的情况下,从Object继承得到的equals实现已经足够了。
超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的。大多数的Set实现都从AbstractSet继承equals实现,List实现从AbstractList继承equals实现,Map实现从AbstractMap继承equals实现。
类是私有的或者是包级私有的,可以确定它的equals方法永远不会被调用。在这种情况下,无疑是应该覆盖equals方法的,以防止它被意外调用:
@Override 
public boolean equals(Object o){ 
  throw new AssertionError(); //Method is never called 
} 

  在覆盖equals方法的时候,你必须要遵守它的通用约定。下面是约定的内容,来自Object的规范[JavaSE6] 
自反性。对于任何非null的引用值x,x.equals(x)必须返回true。
对称性。对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true
传递性。对于任何非null的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也必须返回true。
一致性。对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用该x.equals(y)就会一直地返回true,或者一致地返回false。
对于任何非null的引用值x,x.equals(null)必须返回false。

  结合以上要求,得出了以下实现高质量equals方法的诀窍: 
1.使用==符号检查“参数是否为这个对象的引用”。如果是,则返回true。这只不过是一种性能优化,如果比较操作有可能很昂贵,就值得这么做。 
2.使用instanceof操作符检查“参数是否为正确的类型”。如果不是,则返回false。一般来说,所谓“正确的类型”是指equals方法所在的那个类。 
3.把参数转换成正确的类型。因为转换之前进行过instanceof测试,所以确保会成功。 
4.对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配。如果这些测试全部成功,则返回true;否则返回false。 
5.当编写完成了equals方法之后,检查“对称性”、“传递性”、“一致性”。 


覆盖equals时总要覆盖hashCode 
  一个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。 
在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。
如果两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。

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

相关推荐

从Chiplet到UCIE:D2D互联技术如何重塑半导体设计生态

本文探讨了D2D互联技术在半导体设计中的革命性作用,从Chiplet到UCIE标准的演进如何重塑行业生态。详细分析了D2D互联的技术本质、架构选择及UCIE标准带来的变革,并展望了未来光学D2D和3D集成等趋势。高速互联接口技术的突破为AI加速器和计算芯片提供了更高带宽和能效。

weixin_29292535的博客 929

DSP_基于TMS320F28335和CCS7.2的编程入门

1.准备工作 1.1. 软件 CCS DSP芯片的编程环境 controlSUITE 初学者建议都装上 TI官方提供的通用:头文件、源文件、cmd文件、gel文件、lib文件及实例程序 如:C:\ti\controlSUITE\device_support\f2833x\v142 1.2硬件1.. 仿真器 + 开发板 | 公司设计的DSP板(就是所谓的“目标板”) 2.创建CCS项目 ...

heqiunong的专栏 7400

Langchain与Milvus集成中的pymilvus.exceptions.MilvusException: channel not found错误解析

本文深入解析了在Langchain与Milvus集成时常见的pymilvus.exceptions.MilvusException: channel not found错误。该错误通常由客户端配置错误、网络问题、服务端状态异常或版本不兼容导致。文章提供了从基础连通性测试到高级网络排查的完整故障排除指南,并针对本地Docker、远程服务器及Kubernetes等典型部署场景给出了具体解决方案,帮助开发者快速定位并修复这一连接层问题。

weixin_29229989的博客 217

TMS320F28335入门(一)新建工程

我是在有单片机开发的基础上,学习DSP的。文章只作为自己的备忘录使用,可以参考一下,希望对别人也有所帮助。 首先,要有一块板子,选择核心板还是开发板,看个人选择; 其次,了解一下什么是DSP?DSP可以看成两部分:数字信号处理技术、数字信号处理器(DSC) 文中提到的DSP都是后者;做DSP的有很多公司:什么TI、ADI等等很多;TI公司主要有:C2000、C5000、C6000分别面对各种市场...

qq_38295660的博客 2744

别再盲调PID了!手把手教你用VOFA+实时可视化电机速度曲线(附STM32F4源码)

本文详细介绍了如何使用VOFA+工具实现PID参数的可视化调试,帮助开发者从盲调转向精准调优。通过实时可视化电机速度曲线,结合STM32F4源码示例,展示了如何高效调试Kp、Ki、Kd参数,解决响应慢、超调等常见问题,大幅提升电机控制系统的性能。

weixin_28366475的博客 126

论文、报告中那些乱七八糟的图(甘特图、卡吉图,桑基图,小提琴图,弦图,螺旋图,风玫瑰图)

在一些论文或报告中,总是会看到一些熟悉的图,但作者总是不能好好说话,非得搞个洋名字、缩写字或者半洋半中的词来显示它多么高大上,有时候这种故弄玄虚、华而不实的写法也实在是让人看了不伦不类,图首先是让读者更容易看懂的,不是让你来故作高深、玩玄学的。

David_jiang 9426

新手小白入门TMS320F28335

TMS320F28335数字信号处理控制器的小白入门 笔者是一名普通大学生,自学28335曾经做过许多弯路。写到此文,希望能帮助到大家。28335芯片是由美国德州仪器公司开发的一款DSC(具备数字信号处理的高性能”单片机“)属于c2000系列。具体参数可以到德州仪器官网(https://www.ti.com.cn/)查询。在下不做赘述。 第一步,买一个开发板,我买的是普中科技的,价格公道实惠,在天猫买的19...

weixin_45566357的博客 2万+

COMSOL后处理与可视化

公众号→【COMSOL仿真交流】←更多精彩内容 后处理是采用COMSOL建模的一个重要环节。通过软件自带的可视化工具,可以快速方便的展现仿真结果。 COMSOL为使用者提供了多种后处理工具,包括表面图、切面图、等值线图、流线图、线图、体图等等。可按功能分为数据集(储存数据的地方)、派生值和表单(对数据进行进一步的操作)、绘图组合绘图类型(显示数据结果的地方)、导出数据与生成报告。   如果想用origin、matlab对模拟数据做进一步的处理,导出excel格式的模拟结果,这可以通过“导出

midiio的博客 4027

Java中==和equals()的区别

==和equals()最大的区别是:一个是运算符,一个是方法。 ==:如果比较的对象是基本数据类型,则比较数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址是否相等。 equals():用来比较两个对象的内容是否相等。 注意: equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。 ...

应无所住而生其心 3万+

YOLO26改进策略【Neck】| CVPR2025 LCA轻量交叉注意力 跨层级双向引导 + 分层降噪增强,提升微小目标特征表达

简单相加、拼接融合无法建立深浅层双向约束关系,浅层微小目标易被深层背景覆盖,深层全局信息难以修正浅层噪声;普通单路自注意力仅单一层内建模依赖,缺少跨层级特征互引导机制,深浅特征信息割裂;标准多头跨注意力计算量大、参数量高,轻量化单模态检测/分割网络部署困难,无法区分前景目标与背景噪声。为此设计单模态轻量化交叉注意力LCA,构建浅层细节、深层语义双分支双向引导结构,轻量完成跨层级特征交互,同步降噪并强化单模态微小目标特征。

Limiiiing的博客 522

Autosar MCAL-S32K324 Fee配置-基于EB

Autosar MCAL S32K324 Fee配置详解

赞的博客 1544

java中==和equals和hashCode的区别

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

u013025649的专栏 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

老布丁的博客 1117

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java中equals,hashcode和==的区别

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

爱上在路上 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

H.千面的博客 280

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中equals(),hashcode()和==的区别

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

weixin_33973609的博客 73
上一篇: 返回零长度的数组或者集合,而不是null
下一篇: java 编程小技巧
天天
博客等级 码龄21年 219粉丝 146原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值