「Java面试」为什么重写 equals() 就一定要重写 hashCode() 方法

“为什么重写 equals() 就一定要重写 hashCode() 方法?”

一个工作了4年的粉丝,好不容易拿到一个面试机会,结果就被这个问题暴击了!没办法,只能来向我求助了。

经常有同学在后台跟我吐槽,在求职过程中遇到的各种面试难题。

我发现大部分的问题之前的文章都有分析过,考虑到文章可能太过分散,不方便大家学习,所以我系统整理了一份20万字的文档,有需要的Si信我发送“Mic”领取。

回答这个问题之前,我们先来分析一下这个问题的背景。

问题分析

关于这个问题,首先需要深入了解一下equals这个方法。

这个equals方法是String这个类里面的实现。

从代码中可以看到,当调用equals比较两个对象的时候,会做两个操作

  1. ==号比较两个对象的内存地址,如果地址相同则返回true
  2. 否则,继续比较字符串的值,如果两个字符串的值完全相等,同样返回true

那equals和hashCode()有什么关系呢?

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”拿!

展开阅读全文

页面更新:2024-03-23

标签:重写   方法   约定俗成   冲突   对象   内存   位置   两个   地址   文档

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top