面试官:谈谈equals() 和 == 的区别
引言
談?wù)?/font>equals() 和 == 的區(qū)別,這是一個(gè)非常經(jīng)典的問(wèn)題,不是特別難,面試也時(shí)有問(wèn)道;但是很多小伙伴在面試時(shí)腦子卻一片空白,痛失offer;所以在這里我詳細(xì)介紹一下這兩者的區(qū)別,希望對(duì)你能有幫助;
包裝類
包裝類無(wú)非就是Byte, Short, Integer, Long, Float, Double, Character, Boolean這幾種,所以這里我就用Integer做例子;
對(duì)于包裝類記住一點(diǎn):包裝類的equals()方法已經(jīng)被Sun公司重寫了,所以包裝類的eqauls()方法比較的是內(nèi)容,而==比較的還是兩個(gè)對(duì)象的的地址;
測(cè)試代碼:
輸出結(jié)果:
使用'=='比較num1和num2: false 使用'equals'比較num1和num2: true因?yàn)閚um1 和 num2存放了不同的對(duì)象的地址,所以使用==比較就是false,而num1 和 num2的對(duì)象存放的數(shù)據(jù)都是1000,通過(guò)equals方法比較就會(huì)返回true;
Integer特例
當(dāng)然有時(shí)候使用Integer時(shí)會(huì)發(fā)現(xiàn)一個(gè)神奇的事情,我先展示一個(gè)代碼:
package code01;public class IntegerTest02 {public static void main(String[] args) {Integer num1 = 100;Integer num2 = 100;System.out.println("使用'=='比較num1和num2:");System.out.println(num1==num2); // trueSystem.out.println("使用'equals'比較num1和num2:");System.out.println(num1.equals(num2)); // true} } 使用'=='比較num1和num2: true 使用'equals'比較num1和num2: true可以發(fā)現(xiàn)==竟然是true,num1和num2不是存放的兩個(gè)對(duì)象的地址嗎?這其實(shí)是Java對(duì)Integer的特定設(shè)計(jì),它將-128~127之間的整數(shù)自動(dòng)裝箱成了Integer實(shí)例,所以在這個(gè)范圍的整數(shù)調(diào)用的時(shí)候就直接調(diào)用的封裝好的這些數(shù)字,就不需要再重建Integer實(shí)例了;
其實(shí)這種對(duì)數(shù)據(jù)的緩存有很多好處,很多地方會(huì)使用這種方法提高系統(tǒng)的性能,感興趣可以了解一下;
String類
String類和包裝類就很像了,Sun公司同樣重寫了String的equals方法,同樣比較的是對(duì)象內(nèi)容;
但是String類需要注意,String對(duì)象創(chuàng)建之后就會(huì)存放到常量池中,當(dāng)再次調(diào)用時(shí)會(huì)直接引用常量池中的String對(duì)象;但是如果是自己又創(chuàng)建新的String對(duì)象時(shí)則對(duì)象將不會(huì)在常量池中存儲(chǔ);
測(cè)試代碼:
輸出結(jié)果:
使用'=='比較str1和str2: true 使用'equals'比較str1和str2: true ==========str1和str3=========== 使用'=='比較str1和str3: false 使用'equals'比較str1和str3: true ==========str3和str4=========== 使用'=='比較str3和str4: false 使用'equals'比較str3和str4: true我來(lái)解釋一下代碼:
首先str1創(chuàng)建的String對(duì)象存放到常量池中,然后str2再次使用相同的字符串時(shí)就會(huì)直接引用到常量池中的對(duì)應(yīng)字符串的地址,所以str1和str2引用地址相同,對(duì)象內(nèi)容也相同;
str3則是新創(chuàng)建的一個(gè)對(duì)象,那么str3創(chuàng)建的字符串將不會(huì)存放到常量池中,這就意味著str1和str3引用的對(duì)象不同,那么地址也就不相同了,但是對(duì)象的內(nèi)容都是一樣的;
對(duì)于str3和str4都是一樣的道理:對(duì)象地址不同,對(duì)象內(nèi)容相同;
可以自己動(dòng)手試一下,就明白了;
自定義類型
對(duì)于自定義類型或者或者包裝類、String類以外的數(shù)據(jù)類型,equals比較的就是對(duì)象地址,而不是內(nèi)容,這里我就自定義一個(gè)數(shù)據(jù)類型舉例;
示例代碼:
輸出結(jié)果:
使用'=='比較person1和person2: false 使用'equals'比較person1和person2: false可以看到都是false,因?yàn)檫@里equals和==都是比較的對(duì)象地址,所以如果我們想要比較對(duì)象的內(nèi)容就需要按自定義的比較規(guī)則重寫equals方法;
重寫版本:
輸出結(jié)果:
使用'=='比較person1和person2: false 使用'equals'比較person1和person2: true可以看到重寫后的equals就可以按照自定義的規(guī)則進(jìn)行比較了;
總結(jié)
其實(shí)說(shuō)了這么多,總結(jié)一下:
String類和包裝類的equals()方法已經(jīng)重寫,可以直接比較對(duì)象內(nèi)容;
其余的數(shù)據(jù)類型的equals()方法比較對(duì)象地址,如果想要比較內(nèi)容需要重寫方法;
==都是比較對(duì)象地址;
歡迎大家的點(diǎn)評(píng)!
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的面试官:谈谈equals() 和 == 的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java环境变量配置详细步骤
- 下一篇: 数据结构课程设计——机票售卖系统(C++