首页 > 其他分享 >深入剖析hashCode和equals的区别及大厂面试题

深入剖析hashCode和equals的区别及大厂面试题

时间:2024-07-15 23:00:31浏览次数:13  
标签:面试题 相同 对象 equals hashCode 哈希 重写

关于作者:毕业半年被裁,一个月斩获大厂offer,面试经验50+。“跟着周哥走,offer手里有”。文末免费领取周哥50+场面试总结出的必背面试题。

首先我们要知道,equals()和hashCode()都属于Object类,而Object类是所有类(包括Class)的父类。

搞清楚这一点,再分别解析equals和hashCode,然后作出对比。最后,给出关于equals和hashcode重要面试题及答案。

equals()解析

  • 作用:用于引用数据类型,判断一个对象是否等于另一个对象,可以重写 equals 方法自定义比较规则。

  • ==和equals的区别

    • 如果变量是基本数据类型,那么使用==比较变量的值。
    • 如果变量是引用数据类型,==仍然比较变量的值(不忘初心),只不过这个值是对象的地址。
    • equals只能作用于引用数据类型。 equals如果没有重写,比较的是引用变量的值,即对象地址。equals重写之后,比较的是对象的内容。例如使用equals比较String的value值是否相等。

hashCode()解析

  • 作用:hashCode() 的作用是获取哈希码,也称为散列码,其作用是将对象的地址值(即引用变量)映射为integer类型的哈希值。这个哈希码的作用是确定该对象在哈希表中的索引位置。

注意,字符串(String类型)可能有相同的散列码。这是由于String类型中重写了hashcode方法。 看下图可知,String类型的字符串值是保存在value中的。而value会保存在字符串常量池中。

alt alt 比如,

s1 = "123";
s2 = "123";

s1和s2的引用变量,即对象的地址,是不同的。但由于s1和s2的引用对象的value数组值是相同的。故,在计算哈希值时,s1和s2的就会得到相同的哈希值。

hashCode()和equals()面试题解析

1. hashCode() 和 equals() 两种方法之间有什么关系?

答:

为了在集合类HashMap或HashSet中正确使用散列码,需同时重写 equals 和 hashCode 方法。

两对象比较时,先比较hashCode后比较equals。equals 相同时 hashCode 必相同,但 hashCode 相同时 equals 未必相同。hashCode 是两个对象相同的必要不充分条件。 即:

       equals相同<=>对象相同

       对象相同=>hashcode相同

    否命题:hashCode不同=>对象不同

2. 为什么hashcode相同时,equals不一定相同?

答:有时候不同的对象,hashcode的值可能也会相同,例如:

alt 所以说,hashCode()并不可靠。 equals由于比较的是对象的值,值相同与否是可以确定的,所以是可靠的。

3. 为什么不直接equals比较值是否相同,而先要计算hashCode?

答: hash算法是二进制算法,计算式本质是二进制,所以hash算法速度很快。如若hashCode不同则可直接存储不用equlas比较。所以先计算hashCode大大加快了存储速率。

4. 为什么重写equals后必须重写hashcode? 答:

Object类的equals()方法上方的注释里有写到:当我们将equals方法重写后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中“相同对象必须有相同哈希值”的约定。

由此可见,重写equals后必须重写hashcode是为了保证重写后的equals方法认定相同的两个对象拥有相同的哈希值。

至于equals相同hashcode也必须相同的原因,是为了与Java集合配套使用。

我们可以以hashSet实现去重功能为例,hashSet底层是通过HashMap来实现的,查看源码可以发现HashMap中的Hash()方法,是调用了key.HashCode()。

alt

我们假设自定义一个学生类型Student,且Student只重写了equals方法。然后,new出两个属性值完全一样的对象,将其先后添加到HashSet中。 查看HashMap中的putVal()方法可知, alt 会将传入学生对象的hash值与(数组长度-1)进行&操作,得到数组的下标值。但是由于学生类型,没有重写hashCode,则其hashcode()方法默认是通过对象的地址值的得出。

由于两个学生对象的地址值不同,因此哈希值不同。那么,根据哈希值计算出的索引位置就会不同,则会将两个学生对象存入不同的数组位置。但是,由于equals是根据学生信息计算的,所以equals是相同的。这就违背了hashset的去重功能(hashset不会将相同的对象存到数组中)。因此,必须重写HashCode()方法。

5.会自定义子类重写equals吗?

答:示例如下

alt

好了,到此为止,关于hashcode和equals的知识点大家应该有个深刻的理解了。

点击此处,获取面试秘籍

本文由 mdnice 多平台发布

标签:面试题,相同,对象,equals,hashCode,哈希,重写
From: https://blog.csdn.net/zwsfamily/article/details/140451216

相关文章

  • JVM相关面试题
    来自黑马程序员(新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)_哔哩哔哩_bilibili)目录5.1JVM组成面试官:JVM由那些部分组成,运行流程是什么?面试官:能不能解释一下方法区?面试官:你听过直接内存吗?面试官:什么是虚拟机栈面试官:能说一下堆栈的区别......
  • Java中55种锁,高级面试题,最新面试题
    Java中乐观锁在实际应用中如何解决并发问题?乐观锁通过假设并发冲突发生概率较低来解决并发问题,主要通过数据版本控制实现。在更新数据前,会检查数据版本是否发生变化,只有在数据版本未变时才允许更新,这样可以避免覆盖其他线程所做的更改。1、数据版本控制:通常给数据增......
  • Java 网络协议面试题答案整理,最新面试题
    TCP和UDP的主要区别是什么?TCP(传输控制协议)和UDP(用户数据报协议)的主要区别在于TCP是面向连接的协议,而UDP是无连接的协议。这导致了它们在数据传输方式、可靠性、速度和使用场景方面的不同。1、连接方式:TCP是面向连接的协议,数据传输前需要三次握手建立连接。UDP是无连接......
  • 高频面试题-HTML
    严格模式head,body,Doctype他们的作用是什么?head标签中的元素主要用于描述文档的元信息,如文档的标题、字符集编码、外部资源的链接等。这些信息虽然不直接显示在页面上,但对于文档的结构、样式、行为等方面都有重要的影响。body标签里的内容构成了网页的主体,是用户浏览网页......
  • 前端面试题(JS篇三)
    一、||和&&操作符的返回值?||和&&首先会对第一个操作数执行条件判断,如果其不是布尔值就先进行ToBoolean强制类型转换,然后再执行条件判断。对于||来说,如果条件判断结果为true就返回第一个操作数的值,如果为false就返回第二个操作数的值。&&则相反,如果条件判断......
  • 面试题之一文搞定JS的事件循环机制
    面试又被问到了js事件循环机制,这不狠狠总结一波。事件循环机制是一个非常重要的概念,不仅仅是面试,在笔试以及平时开发过程所遇到的一些问题,都可以通过事件循环机制来理解问题的本质再来解决。在面试的时候,面对这样一道常规的面试题,就一定不能仅仅是将事件循环讲清楚就结束了,一定......
  • 面试题之一文搞定浏览器的渲染原理
    浏览器渲染原理:听过了渡一袁老师的讲解,感觉收获满满,进行一下总结从服务器获取的HTML字符串渲染到页面的整体过程包括以下几步:解析HTML样式计算布局分层生成绘制指令分块光栅化绘制解析HTML:整体过程:解析html代码,生成DOM和CSSOM树在解析的过程中,会遇......
  • Django核心面试题
    Django核心面试题Django核心面试题Django核心面试题1.Django的MVT架构是什么?2.如何创建Django项目和应用?3.DjangoORM是什么?4.什么是Django的middleware?举例说明。5.Django中的静态文件如何处理?6.如何定义Django模型?7.什么是Django的QuerySet?如何......
  • 十万字梳理,带你拿下Java面试题(含答案解析)!
    马上金九银十很多同学/朋友都在忙着找工作,小五给大家整理了一份非常全面的Java面试题含答案总结!从java面试新手到java面试专家,你只差这一份面试题!还不赶紧拿下~内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、Spri......
  • MySQL面试题
    基础篇InnoDB和MyISAM有什么区别?InnoDB支持事务、外键和行锁MyISAM不支持事务、外键和行锁,仅支持表锁;InnoDB不仅缓存索引还缓存真实的数据,MyISAM仅缓存索引,不缓存真实数据;InnoDB中有聚簇索引和非聚簇索引,MyISAM中仅存在非聚簇索引;InnoDB的索引和数据存储在同......