博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓面试中高级安卓开发面试高频题之——equals()和hashcode()关系,区别...
阅读量:6454 次
发布时间:2019-06-23

本文共 1982 字,大约阅读时间需要 6 分钟。

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

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

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

如果你知道他们的异同点,也不要直接回答相不相等。比如,面试官问你:“两个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

转载地址:http://jrfzo.baihongyu.com/

你可能感兴趣的文章
SPOJ104 Highways,跨越数
查看>>
使用rman备份异机恢复数据库
查看>>
Win7-64bit系统下安装mysql的ODBC驱动
查看>>
node中非常重要的process对象,Child Process模块
查看>>
Webserver管理系列:3、Windows Update
查看>>
Linux内核源码详解——命令篇之iostat[zz]
查看>>
Sqlserver2000联系Oracle11G数据库进行实时数据的同步
查看>>
明年计划
查看>>
ORACLE功能GREATEST功能说明具体实例
查看>>
DataGridView 输入数据验证格式(实例)
查看>>
HDOJ 2151
查看>>
Foundation框架 - 快速创建跨平台的网站页面原型
查看>>
open-falcon
查看>>
三菱plc输出指示灯不亮怎么办(转载)
查看>>
doc2vec使用说明(一)gensim工具包TaggedLineDocument
查看>>
intellij maven配置与使用
查看>>
SpringMVC文件下载与JSON格式
查看>>
Q:图像太大,在opencv上显示不完全
查看>>
修正锚点跳转位置 避免头部fixed固定部分遮挡
查看>>
linux下ping不通的解决方法
查看>>