Java学习3—理解equals与“==”

面对这标题,我相信Java程序员会无比熟悉,因为面试题基础面试题中80%都会出现,以我在面试中遇到的统计,100%的面试者都能回答,50分的(答对一半或不完整的)占40%,60分的(说出点的)占60%,可能跟应聘者年限有关,基本上应届生或1年限的为主。想当年我也是这60%中的一员。现在已经具备N(N>=1)年工作经验的你,是否有足够的信息拿下100分呢?

 

来看看正确答案(如果从标准答案中继续探讨更深层次的问题,这是一个基础扎实的表现):

 

equals()和“==”操作用于对象的比较,检查俩对象的相等性,但是他们俩的主要区别在于前者是方法后者是操作符。由于java不支持操作符重载(overloading),“==”的行为对于每个对象来说与equals()是完全相同的,但是equals()可以基于业务规则的不同而重写(overridden )。

 

深入探讨

 

操作符号重载(重载详细概念就暂且不说),这是C++有的而Java没有的一个特点,其实Java还是有一个唯一的操作符号重载,那就是“+”。java对String类型重载了+操作符,可以直接使用+

对两个字符串进行连接。

 
“==”等号操作是什么?

 
“==”或等号操作在Java编程语言中是一个二元操作符,用于比较原生类型和对象。就原生类型如boolean、int、float来说,使用“==”来比较两者,这个很好掌握,就像1+1这样简单,毕

竟这是我们从小到大对操作符号的基础认识。但是在Java编程语言中比较对象的时候,就会与equals()造成困惑。“==”对比两个对象基于内存引用,如果两个对象的引用完全相同(指向同

一个对象)时,“==”操作将返回true,否则返回false。

 

深入探讨

 

除了二元操作符如“==”、“+”、“-”,还有一元操作符如“!”(非)、“+”(加也可以是一元操作符),三元操作符如“?:”(条件 ? 结果1 : 结果2)

 

什么是equals方法?

 

equals()方法定义在Object类里面,根据具体的业务逻辑来定义该方法,用于检查两个对象的相等性。例如:两个Employees被认为是相等的如果他们有相同的empId的话,你可以在你自己的domain对象中重写equals方法用于比较哪两个对象相等。equals与hashcode是有契约的(无论什么时候你重写了equals方法,你同样要重写hashcode()方法),默认的equals方法实现是与“==”操作一样的,基于业务需求重写equals方法是最好的实践之一,同样equals与compareTo保持一致也不足为奇,以至于存储对象在Treemap或treeset集合中时,将使用compareTo方法检查相等性,行为是一致的。


深入探讨

 

在重写equals()方法时,需要遵守它的通用约定:

1、自反性:对于任何非null的引用值x,x.equals(x)必须返回true。
2、对称性:对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。
3、传递性:对于任何非null的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也必须返回true。
4、一致性:对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用该x.equals(y)就会一直地返回true,或者一致地返回false。对于任何非null的

引用值x,x.equals(null)必须返回false。

覆盖equals时总要覆盖hashCode

在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集

合包括HashMap、HashSet和Hashtable。 例如HashMap是基于hashCode进行散列的,当从HashMap插入对象时,通过equals()方法来比较两个不等对象,那么HashCode给不相等的对象产生截然

不同的整数结果,有可能提高散列表的性能。

国有国法,家有家规,所有事情都是基于规则和规范行事,否则世界大乱。了解规则有助于我们更加准确、合理、高效的做任何事情。

==与equals方法有什么区别?

 

==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。


总结:

 

1、使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。
2、==返回true如果两个引用指向相同的对象,equals()的返回结果依赖于具体业务实现。
3、字符串的对比使用equals()代替==操作符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值