这个问题在今年面试中,是出现频率非常高的一道题。并且,在面试过程中前三题中就会出现。这也是安卓走到现在,招聘中级开发工程师的一个起步问题。
关于这个问题,有的面试官会从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