Java中的==和equals()區(qū)別小結(jié)
在 Java 編程中,比較對象的相等性是一個常見的任務(wù)。然而,你是否知道在 Java 中有兩種不同的方法來比較對象的相等性:== 操作符和 equals() 方法?本文將深入探討這兩種方法之間的區(qū)別以及何時使用它們。
== 操作符
首先,讓我們來看看 == 操作符。在 Java 中,== 操作符用于比較兩個對象的引用是否相等,也就是判斷它們是否指向內(nèi)存中的同一個對象。如果兩個對象的引用指向同一個內(nèi)存地址,== 操作符返回 true,否則返回 false。
例如如下代碼:
String str1 = new String("xj"); String str2 = new String("xj"); String str3 = str1; System.out.println(str1 == str2); // 輸出 false,因為兩個不同的對象 System.out.println(str1 == str3); // 輸出 true,引用指向同一個對象
equals() 方法
equals() 方法是 Object 類中定義的方法,用于比較兩個對象的內(nèi)容是否相等。默認(rèn)情況下,equals() 方法在 Object 類中的實現(xiàn)與 == 操作符的行為相同,即只比較對象的引用。然而,許多類會覆蓋 equals() 方法,以便在內(nèi)容上比較對象。
我們先來看下Object equals()方法的源碼:
public boolean equals(Object obj) { return (this == obj); }
可以看到,它使用的也是 == 操作符去判斷的,所以我們?nèi)绻褂胑quals()判斷我們自定義的對象的值是否相等時需要重寫 equals() 方法,java 中其它的一些類基本都會重寫equals()方法;
String 類的源碼:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
可以看到它是先比較兩個對象是否為同一對象,是的話直接返回true,然后在判斷傳入的參數(shù)是否為String,不是的話返回false,是的話在比較兩個String 的值是否相同;
Integer 類源碼:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
AbstractMap 類源碼:
? ? public boolean equals(Object o) { ? ? ? ? if (o == this) ? ? ? ? ? ? return true; ? ? ? ? if (!(o instanceof Map)) ? ? ? ? ? ? return false; ? ? ? ? Map<?,?> m = (Map<?,?>) o; ? ? ? ? if (m.size() != size()) ? ? ? ? ? ? return false; ? ? ? ? try { ? ? ? ? ? ? Iterator<Entry<K,V>> i = entrySet().iterator(); ? ? ? ? ? ? while (i.hasNext()) { ? ? ? ? ? ? ? ? Entry<K,V> e = i.next(); ? ? ? ? ? ? ? ? K key = e.getKey(); ? ? ? ? ? ? ? ? V value = e.getValue(); ? ? ? ? ? ? ? ? if (value == null) { ? ? ? ? ? ? ? ? ? ? if (!(m.get(key)==null && m.containsKey(key))) ? ? ? ? ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? if (!value.equals(m.get(key))) ? ? ? ? ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } catch (ClassCastException unused) { ? ? ? ? ? ? return false; ? ? ? ? } catch (NullPointerException unused) { ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? return true; ? ? }
我們自定義的User 類
import java.util.Objects; public class User { ? ? private String name; ? ? private String address; ? ? private String userId; ? ? @Override ? ? public boolean equals(Object o) { ? ? ? ? if (this == o) return true; ? ? ? ? if (o == null || getClass() != o.getClass()) return false; ? ? ? ? User user = (User) o; ? ? ? ? return Objects.equals(userId, user.userId); ? ? } ? ? @Override ? ? public int hashCode() { ? ? ? ? return Objects.hash(userId); ? ? } ? ? public String getName() { ? ? ? ? return name; ? ? } ? ? public void setName(String name) { ? ? ? ? this.name = name; ? ? } ? ? public String getAddress() { ? ? ? ? return address; ? ? } ? ? public void setAddress(String address) { ? ? ? ? this.address = address; ? ? } ? ? public String getUserId() { ? ? ? ? return userId; ? ? } ? ? public void setUserId(String userId) { ? ? ? ? this.userId = userId; ? ? } }
可以看到如果User對象不為null的話我們equals() 方法只需比較兩個User對象的userId的值是否相同,相同的話即為同一對象,不需要比較其他屬性。
區(qū)別詳解
現(xiàn)在,讓我們總結(jié)一下 == 操作符和 equals() 方法的區(qū)別:
- == 操作符比較對象的引用,判斷是否為同一對象。
- equals() 方法比較對象的內(nèi)容,但默認(rèn)情況下與 == 的行為相同(比較引用)。
- 一些類會覆蓋 equals() 方法以便在內(nèi)容上進(jìn)行比較,例如 String、Integer、Double 等。
當(dāng)你需要比較對象的內(nèi)容時,務(wù)必使用適當(dāng)?shù)姆椒?。同時要注意處理參數(shù)為 null 的情況,以及在自定義類中正確地覆蓋 equals() 方法,以便在語義上正確地比較對象內(nèi)容。
總結(jié)
在 Java 編程中,理解 == 操作符和 equals() 方法的區(qū)別是至關(guān)重要的。通過本文的解釋,相信你已經(jīng)對這兩種方法有了更清晰的認(rèn)識。根據(jù)具體情況,選擇正確的比較方式將有助于你編寫更健壯和可靠的代碼。
到此這篇關(guān)于Java中的==和equals()區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Java ==和equals()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文了解SpringBoot是如何連接數(shù)據(jù)庫的
Spring Boot提供了一系列的開箱即用的功能和特性,使得開發(fā)人員可以快速構(gòu)建和部署應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于SpringBoot是如何連接數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-06-06IDEA自動生成TestNG的testng.xml的插件方法
這篇文章主要介紹了IDEA自動生成TestNG的testng.xml的插件方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04springboot定時任務(wù)備份mysql數(shù)據(jù)庫的實現(xiàn)示例
為了防止數(shù)據(jù)庫被清庫或者誤刪數(shù)據(jù)庫的情況,所以需要定時將mysql數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行備份,本文主要介紹了springboot定時任務(wù)備份mysql數(shù)據(jù)庫的實現(xiàn)示例,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03Springboot整合freemarker 404問題解決方案
這篇文章主要介紹了Springboot整合freemarker 404問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05Eclipse創(chuàng)建java程序可執(zhí)行jar包教程
這篇文章主要為大家分享了Eclipse創(chuàng)建java程序可執(zhí)行jar包教程,具有一定的實用性和參考價值,感興趣的小伙伴們可以參考一下2016-05-05spring-data-jpa中findOne與getOne的區(qū)別說明
這篇文章主要介紹了spring-data-jpa中findOne與getOne的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11深入理解SpringBoot中關(guān)于Mybatis使用方法
這篇文章主要介紹了SpringBoot中關(guān)于Mybatis使用方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-03-03Java中使用正則表達(dá)式獲取網(wǎng)頁中所有圖片的路徑
這篇文章主要介紹了Java中使用正則表達(dá)式獲取網(wǎng)頁中所有圖片的路徑,本文直接給出實例代碼,需要的朋友可以參考下2015-06-06使用java代碼獲取新浪微博應(yīng)用的access token代碼實例
這篇文章主要介紹了使用java代碼獲取新浪微博應(yīng)用的access token實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05