面试的时候,有时候面试官会问:在String对象中,双等号和equals有什么不同?
这时候如果你只是简单地说说双等号比较的是内存地址,equals比较的是字符串是否相同,那是比较减分的。
正确的做法是:深度分析一下,==比较基本类型和对象时的区别,equals方法的来源,String类中重写equals的逻辑等等。
接下来我带你整理一下相关的知识点
笔试问题
String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1==str2);System.out.println(str1.equals(str2));
问题:打印结果是什么?
答案解析
这个问题算是比较简单的,主要考察的是==和equals在String对象应用时的区别,双等号判断两个String对象时候返回false,equals返回true。但是这个知识点所蕴含的知识延伸点是很多的。
知识点总结:
- 两个对象用“==”比对时,比对的是两个对象的内存地址,内存地址不同的话,就返回false;
- java的八个基本类型:byte,short,int,long,float,double,boolean,char
- 基本类型用“==”比对时,比对的是值是否相同。
- 基本类型存放在栈中
- 对象存放在堆中,堆是java占内存最大的一块区域。
- 引用变量存放在栈中,可以有多个引用变量指向一个对象。
- Object是所有对象最原始的父类。
- equals方法是Object自带的,所有类都继承了这个方法。
- String类重写了equals方法。
- Object类中equals方法的逻辑就是:判断两个类是否“==”
- String重写equals方法的逻辑:第一步,先判断两个对象是否“==”,如果成立,则返回true;第二步,如果两个对象“==”不成立,则判断括号里的对象是否属于String类型,如果不属于,返回false;第三步,如果括号里的对象属于String类型,再判断两个比较的String的长度是否相同,如果不同,返回false;第四步,如果两个String长度相同,则判断两个String里的每一个字符是否相同,如果有一个不同,则返回false,如果都相同,则返回true;
- 对象如果重写equals方法,就必须重写hashcode方法。
java脑洞故事
月黑风高,秋风瑟瑟,大地陷入一片寂静,在java世界中某条偏僻的小巷里,运算符族的双等号(==)面对数个对象一族的String门人,依旧气定神闲,不动声色。
其中一个String门人见到双等号如此淡定,忍不住出口喝到:“双等号,这次你死定了,我问你,为何今天我们两位门人str1和str2做相等认证,你不给通过?还非得去比对两人的内存地址是否相同?”
双等号轻轻一笑,淡定回道:“做相等验证,比对内存地址是否相同是我们双等号门派的原则。”
String门人啐了一口:“狗屁原则,你们给基本类型这些下等族类的八个门派做相等验证的时候,可不见你们去比对内存地址,只要他们的数值相同,你们就认证通过。只针对我们对象族的时候,就要比对我们的内存地址了,我看你就是看不起我们对象一族。”
双等号听得此话,不由得脸色微变:“基本类型只比对值,不是我们的规定,而是这个世界的规定。而且基本类型不是什么下等族类,只是他们只生活在栈大陆,安分守己。不像你们对象一族,生活在整个java世界最大的堆大陆,而且你们绝大多数的对象在出生之际,还要从栈大陆找一个和你们相符的引用族人作为你们的连接,有的对象还不止一个。不仅如此,你们绝大多数的工作都由他们来接触,最后引向你们。你们还真是厉害啊!哼!”
说到此,双等号忽然想起什么来,不由得轻蔑笑道:“说起来,你们对象族好像轻易不用我们双等号门派做相等认证吧,你们不是有自己的认证规则吗?我记得好像叫什么'equals',而且我听说你们String门派都把这个'equals'给重新规定了!哈哈哈,可笑可笑!”
String门人带队的队长str听到双等号刺耳的嘲笑,不由得怒从心中起,骂道:“笑你X的笑,我们的'equals'相等认定可是从我们对象族的远古大父Object处继承下来的。”
说到此,他突然想到:Object大父的equals认证法好像就是使用的双等号门派的认证规则,不由得有些心虚,极力辩解道:“我们String门派重写的'equals'认证是为了我们门派内部认证方便,我们有自己的规定。”
str说着有些激动,脑海里回想起自己参与相等认证规则制定时的情景,自己与多位师兄弟,绞尽脑汁,通宵达旦了三天三夜,终于确定下了规矩:
第一步,先看两人是否有双等号的相同认证证书,如果有,就直接判定二人相同。虽然双等号让人不爽,但是,他确实是相同认证的权威。
第二步,如果两人没有相同认证证书,那再看二人是否都是String门人,如果有一人不是,那肯定不相同。
第三步,如果两人都是String门人,那看二人的length()是否相同,这是String门人的一个基本功法,施展此功法,会展示出二人的一个基本属性:长度。如果二人长度不同,那么二人就不可做相同认证。
第四步,如果二人长度也一样,那么就得把二人的每一个字符拿出来对比,只要有一个字符不一样,那还是不能做相同认证。如果二人连每一个字符都一样,那就可以判定二人相同。
str还没回忆完毕呢,双等号又轻蔑的开口了:“虽然你们可以重写equals认证,但是我还听说……”
str不禁心中腹诽:你哪来那么多听说,你是有多八卦啊!
双等号继续道:“我还听说,你们对象一族有规定,想要判定两个对象是否相同,有个前提就是,你们的hashcode值必须相同,否则不可做相同认证。所以我听说,你们对象一族,如果想重写equals认证,必须也得重写hashcode方法。”
str不由得心中一惊,不禁赞道:“想不到你连这个都知道,看来你是偷偷补过课的啊。废话少说,还是纳命来吧!”
说罢,手提钢刀,直冲双等号面门而去。双等号也不由得提起精神,手腕一抖,腰上长剑已然握于手中。
一刀一剑交错纵横,小巷中,“叮叮当当”声音不绝于耳。
但,整个java世界,依然,寂静如初,JVM大神睡眼惺忪的俯视着整片大陆!
(未完待续……)
本来应该写java面试十题第三期的,但是通过这两天的效果查看,大多数同学只看到文章的一半处就跳出了,有少数几位是看完的,所以我在想,每天不更那么多题和知识点了,就找一个知识点作为突破口,延伸下去!而且,我发现,每天一样的格式发面试题,头条的推荐量上不去,所以突发奇想,写了一点另类的小东西,如果大家喜欢,就关注点个赞吧!让我更有动力写下去!