面试的时候,有时候面试官会问:在String对象中,双等号和equals有什么不同?

这时候如果你只是简单地说说双等号比较的是内存地址,equals比较的是字符串是否相同,那是比较减分的。

正确的做法是:深度分析一下,==比较基本类型和对象时的区别,equals方法的来源,String类中重写equals的逻辑等等。

接下来我带你整理一下相关的知识点




java双等号比较合法区间 java双等号比较字符串_内存地址


笔试问题

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。但是这个知识点所蕴含的知识延伸点是很多的。

知识点总结:

  1. 两个对象用“==”比对时,比对的是两个对象的内存地址,内存地址不同的话,就返回false;
  2. java的八个基本类型:byte,short,int,long,float,double,boolean,char
  3. 基本类型用“==”比对时,比对的是值是否相同。
  4. 基本类型存放在栈中
  5. 对象存放在堆中,堆是java占内存最大的一块区域。
  6. 引用变量存放在栈中,可以有多个引用变量指向一个对象。
  7. Object是所有对象最原始的父类。
  8. equals方法是Object自带的,所有类都继承了这个方法。
  9. String类重写了equals方法。
  10. Object类中equals方法的逻辑就是:判断两个类是否“==”
  11. String重写equals方法的逻辑:第一步,先判断两个对象是否“==”,如果成立,则返回true;第二步,如果两个对象“==”不成立,则判断括号里的对象是否属于String类型,如果不属于,返回false;第三步,如果括号里的对象属于String类型,再判断两个比较的String的长度是否相同,如果不同,返回false;第四步,如果两个String长度相同,则判断两个String里的每一个字符是否相同,如果有一个不同,则返回false,如果都相同,则返回true;
  12. 对象如果重写equals方法,就必须重写hashcode方法。

java脑洞故事

月黑风高,秋风瑟瑟,大地陷入一片寂静,在java世界中某条偏僻的小巷里,运算符族的双等号(==)面对数个对象一族的String门人,依旧气定神闲,不动声色。


java双等号比较合法区间 java双等号比较字符串_java双等号比较合法区间_02


其中一个String门人见到双等号如此淡定,忍不住出口喝到:“双等号,这次你死定了,我问你,为何今天我们两位门人str1和str2做相等认证,你不给通过?还非得去比对两人的内存地址是否相同?”

双等号轻轻一笑,淡定回道:“做相等验证,比对内存地址是否相同是我们双等号门派的原则。”

String门人啐了一口:“狗屁原则,你们给基本类型这些下等族类的八个门派做相等验证的时候,可不见你们去比对内存地址,只要他们的数值相同,你们就认证通过。只针对我们对象族的时候,就要比对我们的内存地址了,我看你就是看不起我们对象一族。”

双等号听得此话,不由得脸色微变:“基本类型只比对值,不是我们的规定,而是这个世界的规定。而且基本类型不是什么下等族类,只是他们只生活在栈大陆,安分守己。不像你们对象一族,生活在整个java世界最大的堆大陆,而且你们绝大多数的对象在出生之际,还要从栈大陆找一个和你们相符的引用族人作为你们的连接,有的对象还不止一个。不仅如此,你们绝大多数的工作都由他们来接触,最后引向你们。你们还真是厉害啊!哼!”


java双等号比较合法区间 java双等号比较字符串_java_03


说到此,双等号忽然想起什么来,不由得轻蔑笑道:“说起来,你们对象族好像轻易不用我们双等号门派做相等认证吧,你们不是有自己的认证规则吗?我记得好像叫什么'equals',而且我听说你们String门派都把这个'equals'给重新规定了!哈哈哈,可笑可笑!”

String门人带队的队长str听到双等号刺耳的嘲笑,不由得怒从心中起,骂道:“笑你X的笑,我们的'equals'相等认定可是从我们对象族的远古大父Object处继承下来的。”

说到此,他突然想到:Object大父的equals认证法好像就是使用的双等号门派的认证规则,不由得有些心虚,极力辩解道:“我们String门派重写的'equals'认证是为了我们门派内部认证方便,我们有自己的规定。”

str说着有些激动,脑海里回想起自己参与相等认证规则制定时的情景,自己与多位师兄弟,绞尽脑汁,通宵达旦了三天三夜,终于确定下了规矩:

第一步,先看两人是否有双等号的相同认证证书,如果有,就直接判定二人相同。虽然双等号让人不爽,但是,他确实是相同认证的权威。

第二步,如果两人没有相同认证证书,那再看二人是否都是String门人,如果有一人不是,那肯定不相同。

第三步,如果两人都是String门人,那看二人的length()是否相同,这是String门人的一个基本功法,施展此功法,会展示出二人的一个基本属性:长度。如果二人长度不同,那么二人就不可做相同认证。

第四步,如果二人长度也一样,那么就得把二人的每一个字符拿出来对比,只要有一个字符不一样,那还是不能做相同认证。如果二人连每一个字符都一样,那就可以判定二人相同。


java双等号比较合法区间 java双等号比较字符串_内存地址_04


str还没回忆完毕呢,双等号又轻蔑的开口了:“虽然你们可以重写equals认证,但是我还听说……”

str不禁心中腹诽:你哪来那么多听说,你是有多八卦啊!

双等号继续道:“我还听说,你们对象一族有规定,想要判定两个对象是否相同,有个前提就是,你们的hashcode值必须相同,否则不可做相同认证。所以我听说,你们对象一族,如果想重写equals认证,必须也得重写hashcode方法。”

str不由得心中一惊,不禁赞道:“想不到你连这个都知道,看来你是偷偷补过课的啊。废话少说,还是纳命来吧!”

说罢,手提钢刀,直冲双等号面门而去。双等号也不由得提起精神,手腕一抖,腰上长剑已然握于手中。

一刀一剑交错纵横,小巷中,“叮叮当当”声音不绝于耳。

但,整个java世界,依然,寂静如初,JVM大神睡眼惺忪的俯视着整片大陆!

(未完待续……)


java双等号比较合法区间 java双等号比较字符串_java双等号和equals_05



本来应该写java面试十题第三期的,但是通过这两天的效果查看,大多数同学只看到文章的一半处就跳出了,有少数几位是看完的,所以我在想,每天不更那么多题和知识点了,就找一个知识点作为突破口,延伸下去!而且,我发现,每天一样的格式发面试题,头条的推荐量上不去,所以突发奇想,写了一点另类的小东西,如果大家喜欢,就关注点个赞吧!让我更有动力写下去!