未记录就未发生,用文字记录点滴生活和成长,大家好,这里是功不唐捐。
最近在准备一些技术面试题,发现面试官比较喜欢问的一些题都是平时项目中接触不多的,但是又非常重要的。
仔细一思考,发现这其实和做的项目有关,除了一些基础的技术题以外,面试官更喜欢问一些项目中正在使用的技术以及技术原理。
作为一名普通的CRUD程序员,平时如果仅满足于实现业务需求,也不去学习和巩固基础,那么到了换项目的时候,一定会经历一段时间阵痛。
而拒绝陷入温水煮青蛙状态的最好方式,就是居安思危,把功夫放到平常,因为:日拱一卒,功不唐捐。
今天研究的一个高频面试题是:谈谈你对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来使用。
小结:
不写不知道,一写才发现自己在这方面还是有知识盲区,所以在写的过程中,又去看了一些资料,才有了更深的吸收和理解。
学习的过程就是这样,你知道的越多,就会发现自己不知道的更多,所以才要持续学习,持续总结,用输出倒逼输入。
以上就是今天的分享,我们下篇再见~