一、equal方法概述
Java中的所有類都繼承了Object類,包括Object中的equals()方法。equals()方法用於比較兩個對象是否相等,返回boolean類型值。默認情況下,equals()方法比較的是兩個對象在內存中是否指向同一塊地址。所以,如果需要比較兩個對象中的屬性值是否相等,則需要自定義equals()方法。
二、自定義equals()方法
對於自定義的類,我們需要比較類的屬性是否相等,因此需要重寫equals()方法。在實現自定義equals()方法時需要遵循如下幾個原則:
1. 確定比較的屬性
確定對象需要在哪些屬性上比較,因為比較全部的屬性可能會很耗時
2. 判斷對象是否為null
如果調用equals()方法的對象為null,則返回false。如果比較的對象為null,則返回false或者拋出NullPointerException異常
3. 判斷兩個對象是否為同一類型
如果兩個對象的類型不同,則返回false。可以使用instanceof運算符實現該功能
4. 判斷兩個對象的屬性值是否相等
對比對象的屬性值。如果屬性值全都相等,則返回true,反之則返回false
//自定義類的equals()方法 public boolean equals(Object obj){ //判斷兩個對象是否指向同一塊地址 if(this == obj) return ture; //判斷傳入的對象是否為null if(obj == null || getClass() != obj.getClass()) return false; //比較屬性值是否相等 MyClass myClass = (MyClass)obj; if(this.x == myClass.x && this.y == myClass.y && this.z == myClass.z) return true; return false; }
三、equals()方法的注意事項
1. equals()方法必須具有對稱性
如果a.equals(b)為true,則b.equals(a)也必須為true
2. equals()方法必須具有傳遞性
如果a.equals(b)為true,b.equals(c)為true,則a.equals(c)也必須為true
3. equals()方法必須具有自反性
一個對象和它自身比較應該返回true
4. equals()方法必須具有一致性
如果兩個對象相等,則一直返回true,反之一直返回false
四、equals()方法與hashCode()方法
在需要比較對象的時候,通常也需要使用到hashCode()方法,hashCode()方法用於獲取一個對象的哈希碼,該哈希碼通常用來實現Map集合等數據結構。
關於equals()方法和hashCode()方法,有以下幾點需要注意:
1. 同樣的對象必須有同樣的哈希值
如果兩個對象相等,則它們的哈希值一定相等,反之不一定成立。
2. equals()方法已經被覆蓋,需要覆蓋hashCode()方法
如果自定義了equals()方法,就必須同時覆蓋hashCode()方法,否則會導致使用哈希值的集合出現問題
//自定義類的hashCode()方法 public int hashCode(){ final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; result = prime * result + z; return result; }
3. hashCode()方法不能僅使用對象的某個屬性來計算哈希碼
如果僅使用一個屬性計算哈希碼,那麼會在集合中出現哈希衝突的情況,導致效率降低。一般使用所有屬性的哈希碼相加來計算哈希碼,這樣會更加均勻。
總結
Java的equals()方法是用於比較對象是否相等的方法,在自定義類的equals()方法時需要注意equals()方法的原則和注意事項。同時,equals()方法和hashCode()方法是關聯的,需要同時覆蓋,遵循hashCode()方法的原則。
原創文章,作者:QFGS,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149068.html