hashcode的作用_看似简单的hashCode和equals面试题,竟然有这么多坑!
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面试题,竟然有这么多坑!相关推荐
- equals的效率_看似简单的hashCode和equals面试题,竟然有这么多坑!
点击上方"Java后端技术",选择"置顶或者星标" 你关注的就是我关心的! hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面 ...
- 看似简单的hashCode和equals面试题,竟然有这么多坑!
作者:徐刘根,大家都喊我根哥! hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面试星友的情况来说,绝大部分人都不能很好的回答出来,要么没有逻辑,想到一句就说一句,要 ...
- hashcode的作用_【09期】说说hashCode() 和 equals() 之间的关系?
上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于"hashCode() 和 equals() 之间的关系?"的面试题, ...
- java中的hashcode方法作用以及内存泄漏问题
本文装载:http://hi.baidu.com/iduany/item/6d66dfc9d5f2da1650505870 hashCode()方法的作用&使用分析 一直以来都想写篇文章来说明 ...
- 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...
1. 通过Hash算法来了解HashMap对象的高效性 2. 为什么要重写equals和hashCode方法 3. 对面试问题的说明 <Java 2019 超神之路> <Dubbo ...
- 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写hashcode和equals方法?你能说清楚了吗...
我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...
- java hashcode相等_关于java:hashCode实现,用于“等于某些字段相等”
我希望特定类的对象如果它们的字段之一相等则相等.如何为此类编写一致的hashCode方法? (免责声明,因为我知道这不是最佳实践:该类是另一个类的包装器,应该用于Maps中的键.这是为了使这些对象中的 ...
- android 模拟器作用,安卓模拟器:看似简单实则用处极大的日常功能
原标题:安卓模拟器:看似简单实则用处极大的日常功能 逍遥安卓模拟器每个版本都会推出一些实用性比较强大的功能,并不断完善现有功能,为用户带来良好的游戏体验,今天给大家带来的是每天使用率较高的功能完整版解 ...
- [Java] Hashcode的作用
版权声明:请尊重个人劳动成果,转载注明出处,谢谢!http://blog.csdn.net/amazing7/article/details/51219354 关于HashCode的官方文档定义: h ...
最新文章
- springboot项目使用junit4进行单元测试,maven项目使用junit4进行单元测试
- 教师php一对一修改成绩,【教师助手】班小二发成绩,一键导入成绩表格,自动一对一私密分发...
- linux下挂载iscsi存储设备,linux下挂载ISCSI存储设备
- Python: Json串反序列化为自定义类对象
- mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
- IDEA如何像Eclipse打开多个项目?
- 史上最全Java集合关系图
- 实验教学管理系统 c语言程序代写源码下载
- Math工具类的使用
- 计算机课题立项申报书范文,课题立项申请书怎么写
- Qt调试器出现:the selected debugger may be inappropriate for the inferior的解决方案
- 最近看的电影综艺推荐
- Web网站架构演变历程
- 鱼刺图战略分解法在绩效管理中的应用
- 【科研技巧】PPT如何导出1000dpi的图片
- 微信小程序蓝牙BLE开发——写入一串16进制数据,低字节在前(五)
- Android 仿手机通讯录页面
- 计算机考研复试面试题二
- 利用海康播放库实现视频播放快进功能
- 过滤器Filter详解
热门文章
- python使用正则表达式验证邮箱地址语法有效性
- PR详解及二分类的PR曲线绘制
- Reconstructing complex regions of genomes using long-read sequencingtechnology
- 基于癌症基因组学数据的miRNA 功能模块识别算法研究
- javascript 判断 前端 是 pc端 还是 移动端
- 中医点滴 2 --- 保和丸 + 口气重
- 人脸对齐--Face Alignment In-the-Wild: A Survey
- 安装llvmlite报错解决:RuntimeError: llvm-config failed executing, please point LLVM_CONFIG to the path for
- html5 比例尺,高德地图API之缩放比例尺控件+3D转换
- html form提交前验证,form表单提交前验证实现方法