详解equals()和hashcode()

java的基类Object提供了两种判断对象是否相等的方法equals()和hashcode(),equals判断两对象内存地址是否相等,hashcode()判断两对象的哈希吗。
equals()方法:
Object类中equals方法实现如下:
在这里插入图片描述
可以看到,只要他们是同一个对象,就会返回true.
hashcode()方法:
Object类中的hashcode():
在这里插入图片描述
可看到Object中的hashcode是一个native方法,实际上是将对象地址的哈希值返回。
hashcode()的作用:
总的来说,hashcode()在哈希表中起作用,如HashSet,HashMap;
重写的equals()一般比较全面和复杂,所以执行效率就会很低,而利用hashcode()进行对比,只需要生成一个哈希值进行比较就可以,效率很高。但是hashcode()存在弊端,有时候不同的对象生成的hash值相同。
所以对于大量并且快速对比的话,如果都用equals对比,效率实在是太低了,所以解决方案是:每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

String类中的equals()方法和hashcode()方法:
源码如下:
在这里插入图片描述
在这里插入图片描述
可以看出:
String对象equals()相等的条件是二者同为String对象,长度相同,且字符串值完全相同;不要求二者是同一个对象。
Strin类将hashcode()缓存为哈希值。
为什么重写了equals()就要重写hashcode()?
首先equals与hashcode间的关系是这样的:

1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值