- Java開發之道
- 張振坤 李鐘尉 陳丹丹等編著
- 1177字
- 2018-12-27 19:54:05
細節8 含義不同——使用“==”與equals比較對象
可以使用關系相等運算符“==”和對象的equals ()方法比較對象,但是在比較對象時,兩者是有區別的。
· 關系相等運算符“==”
當使用關系相等運算符“==”比較對象時,比較的是對象的引用是否相同,如果對象的引用相同,則比較的結果就為true,否則比較的結果就為false。
· 對象的equals ()方法
當使用對象的equals ()方法比較對象時,是比較對象的內容(即對象的值)是否相同,而不是比較對象的引用,所以只要兩個對象的內容相同,則使用equals ()方法比較的結果就為true,否則比較的結果就為false。
示例:
String x = new String ("Java"); // 創建String對象x,其值是Java String y = new String ("Java"); // 創建String對象y,其值也是Java
上面的代碼創建了兩個String對象x和y,它們的內容在內存中被存儲到不同的位置,如圖5.11所示。

圖5.11 對象x和y的內存分布
對如圖5.11所示的兩個對象x和y使用關系相等運算符“==”與對象的equals ()方法進行比較,其結果是不同的,示例如下:
String x = new String ("Java"); // 創建String對象x,其值是Java String y = new String ("Java"); // 創建String對象y,其值也是Java System. out. println (x==y); // 用關系相等比較對象x和y System. out. println (x. equals (y)); // 用對象的equals ()方法比較對象x和y
本示例運行后將輸出如下兩行信息:
false true
說明
通過本示例的輸出結果可以看出,對于如圖5.11中所示的兩個對象x和y,通過關系相等運算符“==”進行比較的結果為false,這也充分說明關系相等運算符“==”比較的是對象的引用,雖然對象x和y的內容相同,但是由于引用不同,所以認為x和y是兩個不同的對象;而用對象的equals ()方法比較的結果為true,這也充分地說明了對象的equals ()方法比較的是對象的內容,而與對象的引用無關。
接下來再看一個示例:
String x = "Java"; // 創建String對象x,其值是Java String y = "Java"; // 創建String對象y,其值也是Java
上面的代碼創建了兩個String對象x和y,它們的內容在內存中存儲在相同的位置,也就是同一個對象,就好比兩個人住在同一個房子中,如圖5.12所示。

圖5.12 對象x和y的內存分布
對如圖5.12中所示的兩個對象x和y使用關系相等運算符“==”與對象的equals ()方法進行比較,其結果都是真值true,代碼如下:
String x = "Java"; // 創建String對象x,其值是Java String y = "Java"; // 創建String對象y,其值也是Java System. out. println (x==y); // 用關系相等比較對象x和y System. out. println (x. equals (y)); // 用對象的equals ()方法比較對象x和y
本示例運行后將輸出如下兩行信息:
true true
說明
本示例輸出的兩行信息之所以都是真值true,是因為這兩個對象的引用與內容都相同,所以無論使用的是關系相等運算符“==”,還是對象的equals ()方法,其比較結果都為真值true,這樣創建的兩個對象x和y之所以相同,是因為將相同的字符串常量賦值給不同的字符串變量時,使用了緩存數據,所以這兩個對象的引用與內容是完全相同的。
提示
String類使用的equals ()方法比較的是字符串的內容是否相同,這是由于String類重寫了Object類的equals ()方法,而Object類的equals ()方法則是比較對象的引用是否相同,所以當需要比較其他對象時,可以通過重寫Object類的equals ()方法來定制如何比較對象。
- Data Visualization with D3 4.x Cookbook(Second Edition)
- Deploying Node.js
- Docker and Kubernetes for Java Developers
- Mobile Web Performance Optimization
- Instant Apache Stanbol
- Mastering Selenium WebDriver
- Vue.js快速入門與深入實戰
- 深入實踐Spring Boot
- 從程序員到架構師:大數據量、緩存、高并發、微服務、多團隊協同等核心場景實戰
- Java Web開發技術教程
- Java應用開發技術實例教程
- Mastering Linux Security and Hardening
- Mastering C++ Multithreading
- Python項目實戰從入門到精通
- 網絡綜合布線與組網實戰指南