equals()和hashcode()的区别【大白话Java面试题】

本文讲述了equals()和hashcode()在Java中的作用,强调了hashcode()的效率优势以及它们在对象比较中的使用策略,包括重写hashCode()以确保一致性。同时,介绍了在数据结构如HashSet中的应用注意事项。
摘要由CSDN通过智能技术生成

equals()和hashcode()的区别

  • 大白话

1.equals():反应的是对象或变量具体的值,及两个对象包含的具体的值(可能是对象的引用,也可能是值类型的值)
2.hashcode():计算两个对象的哈希值,并返回哈希码,也叫散列函数。根据Object的hashcode()方法计算出的哈希值是根据其地址进行计算的,其返回值是唯一的,但重写的hashcode()方法就不一定了,有可能会出现哈希冲突。
3.之所以出现hashcode()方法来比较两个对象,是因为hashcode()比equals()的速度快很多。
4.equals()相同,hashcode()一定相同;hashcode()相同,equals()不一定相同。
5.比较对象的方法: ①先比较hashcode()是否相同,相同进行第二步,否则不相同 ②再比较equals(),相同的话,则两个obj相同,否则不相同

  • 详细描述(衍生问题)
  • equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?

因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。

  • hashCode()既然效率这么高为什么还要equals()呢?

因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出(PS:以下两条结论是重点,很多人面试的时候都说不出来):
equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
hashCode()相等的两个对象他们的equals()不一定相等,也就是hashCode()不是绝对可靠的。

  • hashCode()和equals()使用的注意事项
    1、对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equals()去再对比了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
    请添加图片描述
    2、这种大量的并且快速的对象对比一般使用的hash容器中,比如HashSet,HashMap,HashTable等等,比如HashSet里要求对象不能重复,则他内部必然要对添加进去的每个对象进行对比,而他的对比规则就是像上面说的那样,先hashCode(),如果hashCode()相同,再用equals()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。

3、然而hashCode()和equals()一样都是基本类Object里的方法,而和equals()一样,Object里hashCode()里面只是返回当前对象的地址,如果是这样的话,那么我们相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的hashCode()不同,所以这显然不是我们想要的,所以我们必须重写我们类的hashCode()方法,即一个类,在hashCode()里面返回唯一的一个hash值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值