Java面试为什么重写equals()就一定要重写hashCode()方法
"为什么重写 equals() 就一定要重写 hashCode() 方法?"
一个工作了4年的粉丝,好不容易拿到一个面试机会,结果就被这个问题暴击了!没办法,只能来向我求助了。
经常有同学在后台跟我吐槽,在求职过程中遇到的各种面试难题。
我发现大部分的问题之前的文章都有分析过,考虑到文章可能太过分散,不方便大家学习,所以我系统整理了一份20万字的文档,有需要的Si信我发送"Mic"领取。
回答这个问题之前,我们先来分析一下这个问题的背景。问题分析
关于这个问题,首先需要深入了解一下equals这个方法。
这个 equals 方法是String这个类里面的实现。
从代码中可以看到,当调用equals比较两个对象的时候,会做两个操作 用 == 号比较两个对象的内存地址,如果地址相同则返回true 否则,继续比较字符串的值,如果两个字符串的值完全相等,同样返回true
那equals和hashCode()有什么关系呢? 首先,Java里面任何一个对象都有一个native的hashCode()方法 其次,这个方法在散列集合中会用到,比如HashTable、HashMap这些,当添加元素的时候,需要判断元素是否存在,而如果用equals效率太低,所以一般是直接用对象的hashCode的值进行取模运算。
如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;
如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了。
hashCode的值默认是JVM使用随机数来生成的,两个不同的对象,可能生成的HashCode会相同。
这种情况在Hash表里面就是所谓的哈希冲突,通常会使用链表或者线性探测等方式来解决冲突问题。
但是如果两个完全相同的对象,也就是内存地址指向同一个,那么他们的hashCode一定是相同的。
了解了equals和hashCode的关系以后,再来分析这个面试题。
在理论情况下,如果 x.equals(y)==true ,如果没有重写equals方法,那么这两个对象的内存地址是同一个,意味着hashCode必然相等。
但是如果我们只重写了equals方法,就有可能导致hashCode不相同。
一旦出现这种情况,就导致这个类无法和所有集合类一起工作。
所以,在实际开发中,约定俗成了一条规则,重写 equals 方法的同时也需要重写 hashCode 方法。 高手:
如果只重写equals方法,不重写hashCode方法。
就有可能导致 a.equals(b) 这个表达式成立,但是hashCode却不同。
那么这个只重写了 equals 方法的对象,在使用散列集合进行存储的时候就会出现问题。
因为散列结合是使用hashCode来计算key的存储位置,如果存储两个完全相同的对象,但是有不同的hashcode就会导致这两个对象存储在hash表的不同位置,当我们想根据这个对象去获取数据的时候,就会出现一个悖论,一个完全相同的对象会在存储在hash表的两个位置,造成大家约定俗成的规则,出现一些不可预料的错误。 总结
强调一遍,基础很重要,基础很重要。
不要觉得每天写CRUD能解决业务问题就很牛逼了,等你工作了7~8年以后会发现
对技术体系化的理解和技术底层原理的学习才是自己的核心竞争力。
喜欢我作品的同学记得转发、收藏、点赞!!
最新的资料文档已整理,包含如下 (还在持续更新中!):
①100道最新大厂经典面试题解析资料文档!
②20万+字Java面试题解析和配套答案!
③从应届生到高级开发都适用的简历模板!
④从入门到精通的架构师学习路线图!
⑤还有各种技术流程图,路径图!
有需要的 Si 我 "Mic"拿!
聊聊对岸不回来的底气1这两天最大的热点就是湾湾了。作为一个在海外旅居多年的人,我也接触过不少对岸人。先聊聊我印象中的他们,再说说我看到的一些数据。我在欧洲旅行的路上经常能碰到他们,他们那边的孩子毕业旅
土耳其旅游,大街有姑娘问你借打火机,记住不要搭理她们如今,人们的生活是越来越好了,收入越来越高,手里也都有了存款,能够负担起更好的生活需求,比如说,在业余时间,人们除了会经常去一些休闲娱乐场所来放松自己外。(此处已添加小程序,请到今
康养山西夏养山西丨感受夏日山水间的清凉山西炎炎夏日山间的流水林间的阴凉生机勃勃的美丽田园古朴纯粹的乡间小镇一起来山间水边感受夏日山水间的清凉山西人说山西好风光左手一指是太行,右手一指是吕梁五台山恒山历山芦芽山石膏山北武当山
避暑胜地大水川这个周末的说走就走的旅行,原定是我和闺蜜两个人,结果不小心成了七个。周六出门前想的是去留坝,半路看导航前面一段堵车严重,就改道去了红河谷。去了以后本身想着在景区住一晚,结果没订到房
峨眉山金顶十方普贤菩萨像很多去过峨眉山金顶的,都见过十方普贤菩萨像,这尊佛像是峨眉山的标志,也是世界上最大最高的,十方普贤菩萨像。这尊佛像由台座和十方普贤菩萨像组成,通高48米,代表佛祖的48个愿望,这尊
路线寻奥运印记,体验农场生活,感受乡村趣味游戏研学探秘正所谓研有所思,学有所获,旅有所感,行有所成。在学校的课堂上,书本是孩子们的世界。而走出学校,世界是孩子们的书本。然而,研学也是旅游的一部分。当朋友们还在为研学去哪发愁的时
散文欣赏再美的风景,都不及故乡的一草一木,一屋一巷再美的风景,都不及故乡的一草一木,一屋一巷女儿说两年多没回老家了,想回去看看。于是,昨天傍晚一家人驱车回乡。竟然迷路几次,也是够可以的,自嘲一下。一路前行,晚霞,风车,青纱帐在熟悉
最小的海如果问你是海大还是湖大,你一定会毫不犹豫地说海比湖大。但事实上,世间真的有比湖还小的海,它就是世界上最小的海马尔马拉海。马尔马拉海位于亚洲的小亚细亚半岛和欧洲的巴尔干半岛之间,面积
乡村民宿中的工业美学,如此精妙!国外经典作品合集提起乡村民宿,很多人想到的是半亩方塘一鉴开,天光云影共徘徊的田园美景,但殊不知,简单干练的工业美学应用到乡村民宿中,会别有一番风味!不信,来看这些作品!加拿大东部的特色小屋(Abe
韩媒韩国济州岛55名泰国游客脱团失踪海外网8月8日电据韩联社7日报道,韩国出入境部门官员7日透露,截至7日的一个星期内,280名抵达韩国济州岛的泰国游客中,有55人下落不明。韩国济州岛移民局表示,8月2日至8月5日期
独库公路变堵哭公路。打了谁的脸7月9日,新疆维吾尔自治区独库公路大堵车,日通车流量数万,由于该公路设计通行量有限,又没有及时引导疏流,致使逾三万两汽车堵车长达八小时以上,虽然没有关联性,蔚为壮观的堵车流还是让笔