hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面试星友的情况来说,绝大部分人都不能很好的回答出来,要么没有逻辑,想到一句就说一句,要么抓不住重点,答非所问。从这个很小的面试题上我们就可以看出来,对于任何一个面试题来说,都是要清晰有条理的回答。那么如何才能回答到点子上并且让面试官觉得你的逻辑清晰哪?

首先,我们要介绍hashCode()和equals()方法的作用是是什么,然后才说他的区别,说了区别之后再说使用的时候需要注意到的地方,这样的回答思路基本是OK的,如果你在了解一些其他人不知道的那就更好了!下边我们就开始介绍:

一、hashCode()和equals()是什么?

hashCode()方法和equals()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致。

二、hashCode()和equals()的区别

下边从两个角度介绍了他们的区别:一个是性能,一个是可靠性。他们之间的主要区别也基本体现在这里。

1、equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?

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

2、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值,比如下面:

由于标识这个类的是他的内部的变量num和name,所以我们就根据他们返回一个hash值,作为这个类的唯一hash值。

所以如果我们的对象要想放进hashSet,并且发挥hashSet的特性(即不包含一样的对象),则我们就要重写我们类的hashCode()和equals()方法了。像String,Integer等这种类内部都已经重写了这两个方法。

当然如果我们只是平时想对比两个对象 是否一致,则只重写一个equals(),然后利用equals()去对比也行的。

四、扩展

1、阿里巴巴开发规范明确规定:

  • 只要重写 equals,就必须重写 hashCode;
  • 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法;
  • 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals;
  • String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作为 key 来使用;

2、什么时候需要重写?

一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode。

3、那么为什么要重载hashCode呢?

如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。

这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

4、为什么equals()相等,hashCode就一定要相等,而hashCode相等,却不要求equals相等?

  • 因为是按照hashCode来访问小内存块,所以hashCode必须相等。
  • HashMap获取一个对象是比较key的hashCode相等和equals为true。

之所以hashCode相等,却可以equal不等,就比如ObjectA和ObjectB他们都有属性name,那么hashCode都以name计算,所以hashCode一样,但是两个对象属于不同类型,所以equals为false。

5、为什么需要hashCode?

  • 通过hashCode可以很快的查到小内存块。
  • 通过hashCode比较比equals方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。

五、总结

从上边一道简单的面试题我们可以扩展到其他面试题的回答上,首先你要对这个东西明白,然后才能有条理,清晰的给面试官介绍你掌握的内容,描述的过程也是很重要的,不能毫无章法,要游刃有余。


搜索或扫描下述二维码关注微信公众号:Java后端技术(ID: JavaITWork),和20万人一起学Java!

Java后端技术专注Java相关技术:SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,偶尔讲点运维Jenkins、Nexus、Docker、ELK,偶尔分享些技术干货,致力于Java全栈开发!

hashcode的作用_看似简单的hashCode和equals面试题,竟然有这么多坑!相关推荐

  1. equals的效率_看似简单的hashCode和equals面试题,竟然有这么多坑!

    点击上方"Java后端技术",选择"置顶或者星标" 你关注的就是我关心的! hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面 ...

  2. 看似简单的hashCode和equals面试题,竟然有这么多坑!

    作者:徐刘根,大家都喊我根哥! hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面试星友的情况来说,绝大部分人都不能很好的回答出来,要么没有逻辑,想到一句就说一句,要 ...

  3. hashcode的作用_【09期】说说hashCode() 和 equals() 之间的关系?

    上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于"hashCode() 和 equals() 之间的关系?"的面试题, ...

  4. java中的hashcode方法作用以及内存泄漏问题

    本文装载:http://hi.baidu.com/iduany/item/6d66dfc9d5f2da1650505870 hashCode()方法的作用&使用分析 一直以来都想写篇文章来说明 ...

  5. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...

    1. 通过Hash算法来了解HashMap对象的高效性 2. 为什么要重写equals和hashCode方法 3. 对面试问题的说明 <Java 2019 超神之路> <Dubbo ...

  6. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写hashcode和equals方法?你能说清楚了吗...

    我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...

  7. java hashcode相等_关于java:hashCode实现,用于“等于某些字段相等”

    我希望特定类的对象如果它们的字段之一相等则相等.如何为此类编写一致的hashCode方法? (免责声明,因为我知道这不是最佳实践:该类是另一个类的包装器,应该用于Maps中的键.这是为了使这些对象中的 ...

  8. android 模拟器作用,安卓模拟器:看似简单实则用处极大的日常功能

    原标题:安卓模拟器:看似简单实则用处极大的日常功能 逍遥安卓模拟器每个版本都会推出一些实用性比较强大的功能,并不断完善现有功能,为用户带来良好的游戏体验,今天给大家带来的是每天使用率较高的功能完整版解 ...

  9. [Java] Hashcode的作用

    版权声明:请尊重个人劳动成果,转载注明出处,谢谢!http://blog.csdn.net/amazing7/article/details/51219354 关于HashCode的官方文档定义: h ...

最新文章

  1. springboot项目使用junit4进行单元测试,maven项目使用junit4进行单元测试
  2. 教师php一对一修改成绩,【教师助手】班小二发成绩,一键导入成绩表格,自动一对一私密分发...
  3. linux下挂载iscsi存储设备,linux下挂载ISCSI存储设备
  4. Python: Json串反序列化为自定义类对象
  5. mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
  6. IDEA如何像Eclipse打开多个项目?
  7. 史上最全Java集合关系图
  8. 实验教学管理系统 c语言程序代写源码下载
  9. Math工具类的使用
  10. 计算机课题立项申报书范文,课题立项申请书怎么写
  11. Qt调试器出现:the selected debugger may be inappropriate for the inferior的解决方案
  12. 最近看的电影综艺推荐
  13. Web网站架构演变历程
  14. 鱼刺图战略分解法在绩效管理中的应用
  15. 【科研技巧】PPT如何导出1000dpi的图片
  16. 微信小程序蓝牙BLE开发——写入一串16进制数据,低字节在前(五)
  17. Android 仿手机通讯录页面
  18. 计算机考研复试面试题二
  19. 利用海康播放库实现视频播放快进功能
  20. 过滤器Filter详解

热门文章

  1. python使用正则表达式验证邮箱地址语法有效性
  2. PR详解及二分类的PR曲线绘制
  3. Reconstructing complex regions of genomes using long-read sequencingtechnology
  4. 基于癌症基因组学数据的miRNA 功能模块识别算法研究
  5. javascript 判断 前端 是 pc端 还是 移动端
  6. 中医点滴 2 --- 保和丸 + 口气重
  7. 人脸对齐--Face Alignment In-the-Wild: A Survey
  8. 安装llvmlite报错解决:RuntimeError: llvm-config failed executing, please point LLVM_CONFIG to the path for
  9. html5 比例尺,高德地图API之缩放比例尺控件+3D转换
  10. html form提交前验证,form表单提交前验证实现方法