安卓面试中高级安卓开发面试高频题之——equals()和hashcode()关系,区别

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 这个问题在今年面试中,是出现频率非常高的一道题。并且,在面试过程中前三题中就会出现。这也是安卓走到现在,招聘中级开发工程师的一个起步问题。关于这个问题,有的面试官会从object这个类来引出。

这个问题在今年面试中,是出现频率非常高的一道题。并且,在面试过程中前三题中就会出现。这也是安卓走到现在,招聘中级开发工程师的一个起步问题。


关于这个问题,有的面试官会从object这个类来引出。比如会先问:object这个类有哪些方法。然后再转移到这个equals和 hashcode的问题上。


我相信你一定也从各个地方查到了他们的异同点。如果你不知道,那么我建议你去百度一下他们的比较原理,这里我只给出一个分享链接:https://www.cnblogs.com/keyi/p/7119825.html


如果你知道他们的异同点,也不要直接回答相不相等。比如,面试官问你:“两个a,equals相等吗?hashcode相等吗?”。这个问题不要直接作答相不相等。这道题是有坑的。回答相等,不好;回答不相等也不好。面试官的意图不是要你回答相不相等。哪怕你就是知道相不相等,知道答案,你直接回答相不相等,不是一个好的回答。在《技术岗面试中面临的最大困境》一文中我有说到:技术岗面试的最大困境(挑战)在于如何在面试中,最大程度的表达出你的技术能力。所以,这道题,我建议的回答方式如下:


相不相等,要看重不重写这2个方法。

(话外音:你可以找到object这个类,找到这2个方法,有英文的注释说明,如果你觉得看源码费劲,那么我直接给你说结果)

第一:equal()相等的两个对象他们的hashCode()肯定相等。(hashcode经过hash计算得到的是一个int值)

第二:hashCode()相等的两个对象他们的equal()不一定相等。


在Java中,哈希码代表对象的特征。

例如对象

String str1 = “aa”, str1.hashCode= 3104

String str2 = “bb”, str2.hashCode= 3106

String str3 = “aa”, str3.hashCode= 3104

根据HashCode由此可得出str1!=str2,str1==str3

下面给出几个常用的哈希码的算法。

1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

默认情况(没有重写equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。

要是类中重写了equals方法,那么就要根据具体的代码来确定equals方法的作用了,重写后一般都是通过对象的内容是否相等来判断对象是否相等。

2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。所以,两个“a”,如果是String类型的,他们的哈希值是一样的。

3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,

例如Integer i1=new Integer(100) ,  i1.hashCode的值就是100 。

由此可见,2个一样大小的Integer对象,返回的哈希码也一样


好了,说了这么多,你试试记不住?

面试的时候,要表达这么多有难度对吧。那好,如果你不能表达好上面的,那么我就给你一个面试的时候的一个答案吧:


第一:equal()相等的两个对象他们的hashCode()肯定相等。(hashcode经过hash计算得到的是一个int值)

第二:hashCode()相等的两个对象他们的equal()不一定相等。


第三:对于需要大量并且快速的对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了(别就比较一个string ,你也先用hashcode,再用equals)。

 

以上就是面试时这个问题的回答方式。你记住了吗?


引申:如果面试官问:有一个对象,Student a

= new Student(“小饼干”) , Student b = new Student(“小饼干”),那么a b,的hashcode 和 equals分别相等吗?这个思考题就留给你了。如果你真的理解了这2个方法的原理,那就在下方留下你的答案吧。(备注:答案本文中就可以知道。)


提醒:转换成String的几种方法,还有他们的区别。这个初级题,自己表述一下(重要的事情说三遍,是表达一下,不是在心里知道。表达一遍!表达一遍!!表达一遍!!!)


欢迎各位大佬,各位精英,各位祖国的栋梁积极投稿。投稿邮箱:578161213@qq.com

@



���r���E

相关文章
|
9月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1688 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
9月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1101 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
9月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1188 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
10月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
920 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
9月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
420 0
|
10月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
1349 6
|
10月前
|
XML 编解码 Android开发
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
810 0
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
|
12月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
699 11
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
5510 77
|
12月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
516 0