hashcode的作用_016 面试系列—谈谈你对hashCode()方法的认识

未记录就未发生,用文字记录点滴生活和成长,大家好,这里是功不唐捐。

最近在准备一些技术面试题,发现面试官比较喜欢问的一些题都是平时项目中接触不多的,但是又非常重要的。

仔细一思考,发现这其实和做的项目有关,除了一些基础的技术题以外,面试官更喜欢问一些项目中正在使用的技术以及技术原理。

作为一名普通的CRUD程序员,平时如果仅满足于实现业务需求,也不去学习和巩固基础,那么到了换项目的时候,一定会经历一段时间阵痛。

而拒绝陷入温水煮青蛙状态的最好方式,就是居安思危,把功夫放到平常,因为:日拱一卒,功不唐捐。

bdfc46e1423b3749f2fa0af2274f35d9.png

今天研究的一个高频面试题是:谈谈你对hashCode()方法的认识。

这个题目其实有很多相关问题,比如使用HashMap时,需要重写哪两个方法?为什么需要重写?再比如,重写了equals()方法,还需要重写hashCode()方法么?还有如何重写equals()和hashCode()方法?这两个方法之间的区别是什么?

在经过一番搜索和整理之后,就有了这篇关于hashCode()方法的总结。为什么需要自己写总结呢?

因为别人写的再好,也是别人的。只有自己真正理解,并能用自己的话讲出来之后,才能在和面试官讨论到这个问题时,做到侃侃而谈,要知道,真正的自信一定是来自于自身真正的实力。

那么,hashCode()到底是何方神圣呢?接下来,我们就一起来看看。

01 hashcCode()的基本概念

hashCode()是Object类下的一个方法,默认情况下,hashCode()会返回一个对象的32位JVM内存地址。它的目的是方便查询创建的每一个对象。

换句话说,就相当于数组当中的索引,每次需要去内存中找某个对象时,根据它的内存地址,即hashCode()结果就可以快速定位。

02 hashCode()和equals()的区别

从hashCode()的基本概念中可以知道,它的作用主要是用来查询对象的位置。而equals()方法则是用来比较两个对象是否相等,但是默认情况下,Object下的equals()方法只是判断两个对象的地址是否相等,但如果对其进行重写后,就不仅仅是判断内存地址了,而是对象具体内容。

因此,我们可以得知hashCode()和equals()的区别:

1. hashCode()相等的两个对象,equals()结果不一定相等;

2.hashCode()不相等的两个对象,equals()一定不相等; 

3.equals()相等的两个对象,hashCode()结果一定相等。

03 何时重写hashCode()和equals()

当业务代码中出现自定义对象,且有业务需求的具体比较规则时,需要重写equals()方法。并且要注意的是,重写equals()时,也一定要重写hashCode()。

这是由于在HashMap中,是通过获得key的hashCode值来查找和判断,而当自定义对象作为key时,只有重写hashCode(),才能保证同一个对象key,获得相同的value值,否则不符合实际情况。

另外在Set中,是不允许有重复元素的。如果自定义对象作为元素,又不重写hashCode()方法,那么就会出现由于两个相同的元素而hashCode值不同,所以同时出现在Set中,这也是不符合Set规则的。

因此,阿里巴巴开发规范中明确规定:

1.只要重写equals(),就一定要重写hashCode();

2.因为Set存储的是不重复的对象,依据hashCode和equals判断,所以Set存储的对象必须重写这两个方法。

3.如果自定义对象做了Map的key,那么必须重写hashCode和equals();

4.String重写了hashCode和equals,所以我们可以很愉快地把String当作Map中的key来使用。

小结:

不写不知道,一写才发现自己在这方面还是有知识盲区,所以在写的过程中,又去看了一些资料,才有了更深的吸收和理解。

学习的过程就是这样,你知道的越多,就会发现自己不知道的更多,所以才要持续学习,持续总结,用输出倒逼输入。

以上就是今天的分享,我们下篇再见~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值