Java中equals()方法的理解與使用方法例子
前言
在Java中,equals()
方法是用于比較兩個(gè)對(duì)象是否相等的重要方法。它屬于Object
類的方法,因此所有的Java對(duì)象都繼承了這個(gè)方法。但是,Object
類中的equals()
方法默認(rèn)實(shí)現(xiàn)是比較兩個(gè)對(duì)象的引用是否相同,即它們是否指向內(nèi)存中的同一個(gè)對(duì)象。在實(shí)際開發(fā)中,我們往往需要根據(jù)對(duì)象的實(shí)際內(nèi)容來判斷是否相等,這時(shí)就需要重寫equals()
方法。
一、equals()方法的理解
equals()
方法用于比較兩個(gè)對(duì)象的內(nèi)容是否相等,而不是比較它們的引用是否相同。例如,我們有兩個(gè)Person
對(duì)象,它們的姓名和年齡都相同,但它們是兩個(gè)獨(dú)立的對(duì)象,存儲(chǔ)在內(nèi)存中的不同位置。如果我們想要判斷這兩個(gè)對(duì)象是否“相等”(即它們的屬性都相同),就需要重寫equals()
方法。
二、equals()方法的使用
1. 重寫equals()方法
當(dāng)我們需要比較兩個(gè)對(duì)象的內(nèi)容是否相等時(shí),需要重寫equals()
方法。重寫時(shí),需要遵循以下幾個(gè)原則:
- 自反性:對(duì)于任何非null的引用值x,
x.equals(x)
必須返回true
。 - 對(duì)稱性:對(duì)于任何非null的引用值x和y,當(dāng)且僅當(dāng)
y.equals(x)
返回true
時(shí),x.equals(y)
也必須返回true
。 - 傳遞性:對(duì)于任何非null的引用值x、y和z,如果
x.equals(y)
返回true
,并且y.equals(z)
返回true
,那么x.equals(z)
也應(yīng)該返回true
。 - 一致性:對(duì)于任何非null的引用值x和y,多次調(diào)用
x.equals(y)
始終返回true
或始終返回false
,前提是對(duì)象上equals
比較中所用的信息沒有被修改。 - 對(duì)于任何非null的引用值x,
x.equals(null)
必須返回false
。
示例代碼:
public class Person { private String name; private int age; // 構(gòu)造函數(shù)、getter和setter方法省略... @Override public boolean equals(Object obj) { // 1. 檢查是否為同一個(gè)對(duì)象引用 if (this == obj) { return true; } // 2. 檢查傳入對(duì)象是否為null以及類型是否匹配 if (obj == null || getClass() != obj.getClass()) { return false; } // 3. 類型匹配,將obj轉(zhuǎn)型為Person類型 Person other = (Person) obj; // 4. 比較屬性是否相等 return age == other.age && (name == null ? other.name == null : name.equals(other.name)); } @Override public int hashCode() { // 當(dāng)重寫equals方法時(shí),通常也需要重寫hashCode方法,以維護(hù)hashCode的一般約定 // 這里使用簡單的計(jì)算方式,實(shí)際應(yīng)用中可能需要更復(fù)雜的計(jì)算來確保散列分布均勻 return Objects.hash(name, age); } }
2. 使用equals()方法
重寫equals()
方法后,我們就可以使用它來比較兩個(gè)對(duì)象的內(nèi)容是否相等了。
示例代碼:
public class Main { public static void main(String[] args) { Person person1 = new Person("Alice", 25); Person person2 = new Person("Alice", 25); Person person3 = new Person("Bob", 30); // 使用equals()方法比較對(duì)象內(nèi)容是否相等 System.out.println("person1 equals person2: " + person1.equals(person2)); // 輸出:true System.out.println("person1 equals person3: " + person1.equals(person3)); // 輸出:false // 注意:不要使用 == 來比較對(duì)象內(nèi)容是否相等 System.out.println("person1 == person2: " + (person1 == person2)); // 輸出:false,因?yàn)閜erson1和person2是兩個(gè)不同的對(duì)象 } }
在上面的示例中,我們創(chuàng)建了三個(gè)Person
對(duì)象,并使用equals()
方法比較了它們的內(nèi)容是否相等。可以看到,即使person1
和person2
是兩個(gè)不同的對(duì)象,但由于它們的屬性相同,所以person1.equals(person2)
返回true
。而person1
和person3
的屬性不同,所以person1.equals(person3)
返回false
。
總結(jié)
equals()
方法在Java中扮演著非常重要的角色,特別是在處理對(duì)象比較時(shí)。默認(rèn)情況下,equals()
方法繼承自Object
類,僅僅比較兩個(gè)對(duì)象的引用是否相同,即它們是否指向內(nèi)存中的同一個(gè)位置。然而,在實(shí)際應(yīng)用中,我們往往需要根據(jù)對(duì)象的實(shí)際內(nèi)容(即對(duì)象的屬性)來判斷它們是否相等。這時(shí),就需要重寫equals()
方法。
重寫equals()
方法時(shí),需要遵循自反性、對(duì)稱性、傳遞性、一致性和對(duì)于非null對(duì)象與null比較的規(guī)則。在比較對(duì)象屬性時(shí),如果屬性也是對(duì)象,那么應(yīng)該遞歸地調(diào)用這些對(duì)象的equals()
方法進(jìn)行比較,而不是簡單地使用==
操作符。
另外,當(dāng)重寫equals()
方法時(shí),通常也需要重寫hashCode()
方法,以確保兩個(gè)相等的對(duì)象具有相同的哈希碼。這是因?yàn)樵贘ava中,很多集合類(如HashSet
、HashMap
等)都依賴于hashCode()
方法來實(shí)現(xiàn)高效的元素存儲(chǔ)和檢索。
使用equals()
方法時(shí),要注意不要與==
操作符混淆。==
操作符用于比較兩個(gè)對(duì)象的引用是否相同,而equals()
方法用于比較兩個(gè)對(duì)象的內(nèi)容是否相等。
總之,理解并正確使用equals()
方法是Java編程中必不可少的一部分。通過重寫equals()
方法,我們可以根據(jù)對(duì)象的實(shí)際內(nèi)容來判斷它們是否相等,從而更準(zhǔn)確地處理對(duì)象比較的邏輯。同時(shí),也要注意與==
操作符的區(qū)別,避免在代碼中產(chǎn)生邏輯錯(cuò)誤。
附:重寫equals方法練習(xí)
package object; /* 判斷兩個(gè)person對(duì)象的內(nèi)容是否相等 如果兩個(gè)person對(duì)象的各個(gè)屬性值都一樣,則返回true,反之返回false */ public class EqualsExercise { public static void main(String[] args) { Person person1 = new Person("jack", 10, '男'); Person person2 = new Person("jack", 10, '男'); System.out.println(person1.equals(person2)); //輸出結(jié)果是true } } class Person { private String name; private int age; private char gender; //重寫Object的equals方法 public boolean equals(Object obj) { //如果比較的兩個(gè)對(duì)象是同一個(gè)對(duì)象,則直接返回true if (this == obj){ //this就代表調(diào)用equals方法的那個(gè)對(duì)象,obj就是方法里面的實(shí)參 return true; } //類型判斷 if (obj instanceof Person){ //obj是Person,我們才比較 //進(jìn)行 向下轉(zhuǎn)型(即obj轉(zhuǎn)成Person); 因?yàn)槲倚枰玫給bj的各個(gè)屬性,如果不轉(zhuǎn)型,拿不到 Person p = (Person) obj; return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender; } //如果不是person,則直接返回false;總不能拿一個(gè)人跟一個(gè)狗比 return false; } public Person(String name, int age, char gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } }
Tips:
instanceof的用法:result = object instanceof class
instanceof左邊是對(duì)象,右邊是類;當(dāng)對(duì)象是右邊類或子類所創(chuàng)建對(duì)象時(shí),返回true;否則,返false。
到此這篇關(guān)于Java中equals()方法的理解與使用方法的文章就介紹到這了,更多相關(guān)Java equals()方法使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java equals()方法使用詳解及總結(jié)
- Java中==符號(hào)與equals()的使用詳解(測試兩個(gè)變量是否相等)
- 詳解Java中==和equals()的區(qū)別
- Java中==和equals()的區(qū)別總結(jié)
- Java中equals()方法實(shí)例詳解
- Java中equals()方法重寫實(shí)現(xiàn)代碼
- 詳解Java中“==”與equals()的區(qū)別
- Java中的== 和equals()方法詳解與實(shí)例
- 詳解java==運(yùn)算符和equals()方法的區(qū)別
- Java自定義實(shí)現(xiàn)equals()方法過程解析
相關(guān)文章
Java中BigDecimal的舍入模式解析(RoundingMode)
這篇文章主要介紹了Java中BigDecimal的舍入模式解析(RoundingMode),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06舉例說明Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用
這篇文章主要介紹了Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用,接口隔離原則主張一個(gè)類對(duì)另外一個(gè)類的依賴性應(yīng)當(dāng)是建立在最小的接口上,需要的朋友可以參考下2016-02-02JavaFX實(shí)現(xiàn)簡易時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了JavaFX實(shí)現(xiàn)簡易時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類
這篇文章主要介紹了Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09初始JAVA模塊化開發(fā)的超詳細(xì)步驟(適合菜鳥)
這篇文章主要介紹了初始JAVA模塊化開發(fā)的超詳細(xì)步驟,詳細(xì)解釋了模塊描述符的職責(zé)、模塊路徑的概念以及如何使用命令行運(yùn)行模塊化Java程序,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03Java常見基本數(shù)據(jù)結(jié)構(gòu)概覽
這篇文章主要介紹了Java常見的幾種基本數(shù)據(jù)結(jié)構(gòu),包括其含義和用法,,需要的朋友可以參考下2017-09-09Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理
這篇文章主要介紹了Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理,包括類與方法以及多態(tài)等支持面向?qū)ο笳Z言中的重要特點(diǎn),需要的朋友可以參考下2016-01-01springboot整合webservice使用簡單案例總結(jié)
WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語言,平臺(tái)等,可以實(shí)現(xiàn)不同的語言間的相互調(diào)用,下面這篇文章主要給大家介紹了關(guān)于springboot整合webservice使用的相關(guān)資料,需要的朋友可以參考下2024-07-07