java中equals(),hashcode()和==的区别
一、==
java中的数据类型,可分为两种:
- 基本数据类型,也称原始数据类型
byte,short,int,long,float,double,char,boolean 他们之间的比较,应该用双等号(==),这是比较他们的值;
- 引用类型(类、接口、数组)
当用==对它们进行比较的时候,比较的是它们在内存中的存放地址,所以,除非是同一个new出来的对象,他们比较的结果为true,否则为false;对象是存放在堆中的,栈中存放在是对象的引用(地址)。
由此可见,==是对栈中的值进行比较。如果要比对堆中的对象是否相同,那就要重写equals方法了。
如下的情况要注意:
Integer a1 = 127;
Integer b1 = 127;
Integer a = 128;
Integer b = 128;
a1==b1,是为true,但a==b是返为false ,为什么呢?
看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer b1 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。
所以a1==b1:true;a==b:false
二、equals()
1、默认情况(没有覆盖equals方法),equals方法都是调用Object类的equals方法,而Object类的equals方法是判断对象的内存地址引用是不是同一个地址;
2、如果类覆盖equals方法,那就要根据代码来确认equals方法的作用了,覆盖后一般根据对象的内存是否相等来判断对象是否相等;
这里对equals重新需要注意五点:
1 自反性:对任意引用值X,x.equals(x)的返回值一定为true.
2 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false
三、hashcode()
hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。事实上,Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。
Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
散列函数,散列算法,哈希函数。
是一种从任何一种数据中创建小的数字“指纹”的方法。
散列函数将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。
好的散列函数在输入域中很少出现散列冲突。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)