一、equals()方法的基本概念
在Java語言中,equals()方法是比較兩個對象是否相等的方法。Object類中的默認實現是比較兩個對象的引用是否相等。但是,對於我們自定義的類,需要覆蓋equals()方法,根據實際需求進行比較。一般來說,比較的內容包含對象的屬性,也可以考慮對象的指向等其他特殊情況。
Java語言規定:如果兩個對象使用equals()方法比較相等,那麼兩個對象的hashCode()方法的返回值必須相等。
public boolean equals(Object obj) { if (obj == null) { return false; } if (!this.getClass().equals(obj.getClass())) { return false; } if (this == obj) { return true; } YourClass yourClass = (YourClass) obj; //比較兩個對象是否相等 return this.property1 == yourClass.property1 && this.property2.equals(yourClass.property2); }
二、重寫equals()方法的細節
1、先確認equals()方法的契約
在自定義類中覆蓋equals()方法時,首先要溝通好同事之間使用這個方法的意義。例如,這裡的”相等”是指什麼?在定義相等的時候,往往也定義了相同的hashCode(),因此它們是相等的。在選擇相等的概念時,需要注意的是如何使類在“集合框架”和其他Java庫的所有客戶端中表現良好。
2、遵守自反性、對稱性、傳遞性、一致性和非空性
在實現equals()方法時,需要遵守以下五項規則:
- 自反性:x.equals(x)始終返回true。
- 對稱性:x.equals(y)與y.equals(x)的結果應該相同,無論x、y的值如何。
- 傳遞性:如果x.equals(y)返回true,y.equals(z)返回true,那麼x.equals(z)也應該返回true。
- 一致性:如果x.equals(y)返回true,那麼多次調用x.equals(y)的結果應該始終為true或為false。
- 非空性:x.equals(null)始終返回false。
3、使用getClass()檢查屬性的類型
在具有繼承性的類中,如果沒有getClass()方法,equals()方法可能會將派生類實例與其基類實例視為等同。這樣可能會導致一些意想不到的結果。為了避免這種情況,可以使用getClass()方法將派生類實例與基類實例區分開來。如果兩個對象的類不同,那麼它們肯定不相等。
4、避免使用instanceof運算符
在某些情況下,可能會想通過使用instanceof運算符實現equals()方法。但這種方法會破壞equals()方法的對稱性和傳遞性。如下所示:
public boolean equals(Object obj) { if (!(obj instanceof YourClass)) { return false; } YourClass yourClass = (YourClass) obj; //比較兩個對象是否相等 return this.property1 == yourClass.property1 && this.property2.equals(yourClass.property2); }
在上述代碼中,如果obj是YourSubClass的一個實例,那麼在比較yourClass的屬性時會導致ClassCastException異常。因此,盡量不要使用instanceof運算符進行類型判斷。
三、使用Objects.equals()方法進行比較
Java SE 7 中添加了 Objects類,該類包含靜態方法equals(),可以用來比較兩個對象是否相等。引用為null的對象也被處理得非常好,因此它們不會拋出NullPointerException異常。例如:
public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final YourClass other = (YourClass) obj; if (!java.util.Objects.equals(this.property1, other.property1)) { return false; } if (!java.util.Objects.equals(this.property2, other.property2)) { return false; } return true; }
四、總結
equals()方法是Java對象比較的方法,在自定義類中,需要重寫equals()方法,實現根據實際需求進行比較。在重寫equals()方法時,需要遵守equals()方法的契約,並使用Objects.equals()方法進行比較。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/157465.html