==、equals以及hashCode的理解及相关面试题

项目中经常用到==以及equals,但是他们直接的区别好多都是在面试的时候才会被问到,想到这问题的时候代码中可能会想起部分用到==与equals的地方,比如判断boolean用==的场景以及字符串用equals。但是我们也都知道重写equals的时候必须重写hashCode,但是具体原因没有深入研究过。

一、==与equals的区别

面试的时候初级的程序员一般会被问到,当时都是死记硬背的,没有真正理解。
两者相同点笼统的说就是都是用来判断对象是否相等的。
==:是用来判断两个对象的地址是否相等。java的基本数据类型比较是否相等只能用==。
equals:有两种情况,
未覆盖equals方法的时候直接调用的是继承子Object的equals方法。
这里写图片描述
可以看到是等价于直接使用==比较的,比较的地址,也就是说是不是同一个对象。
覆盖equals方法的时候,这个时候equals是自己定义的,一般是比较两者的内容是否相同。

通过具体的代码看一下覆盖与不覆盖的区别
新建一个Person实体:
这里写图片描述
打印如下信息及显示的结果
这里写图片描述

在没有覆盖equals的时候,equals是等价与==的。但是在实际的业务中,我们又知道,同一个人我们是需要让程序返回的结果是true。所以这个时候就需要重写equals,判断的就是内容是否相同。

这里写图片描述
在原来Person类的基础上重写equals及hashCode方法。同样再看执行上面的代码的结果

这里写图片描述

二、hashCode与equals的联系

这样的结果才是我们平常的业务中需要的,但是有可能又不理解了,那么满足平常的业务重写equals就行了,为什么要重写hashCode呢,hashCode又有什么作用呢?

hashCode是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。
hashCode与equals的联系就是:
1.如果两个对象相等,那么特闷的hashCode值一定相同
2.如果两个对象的hashCode相同,对象不一定相等。

可能还是不理解,我需要的是equals判断相等,hashCode跟我没什么关系,但是java中还有其他地方用其他的方式来处理相等的对象。比如Set。
集合Set中元素是无需且不可重复的,那么如何在插入数据的时候判断集合中是否已经存在改数据了呢,可能好多人会说使用for循环,然后equals比较,但是这样在set数据量大的时候运行效率就会很低,java中是使用了哈希算法(也叫散列算法)来解决了。在添加数据时,根据数据的hashCode依照特定的算法映射到一个地址,判断该地址是否有元素,如果没有,那么就可以直接存储,如果有那就需要equals比较。这样就提高了存取效率,也就是要重写hashCode的原因。

我写了段代码来验证了一下:
未重写hashCode:
这里写图片描述
明显这个不是我们业务需要的。所以需要重写hashCode
重新hashCode的:
这里写图片描述

总结这一篇,进可逢面必过,远可大吹牛X。呵呵,个人觉得还是蛮有用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值