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