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

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

 

关于这个问题,有的面试官会从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

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

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

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

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

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

3Integer类,返回的哈希码就是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

@

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值