《Java 核心技术卷1 第10版》学习笔记------Object类的 equals 方法
Object 簡述
Object 類是 Java 中所有類的始祖, 在 Java 中每個類都是由它擴展而來的。
在 Java 中, 只有基本類型 ( primitive types) 不是對象, 例如,數值、 字符和布爾類型的值都不是對象。
所有的數組類塱,不管是對象數組還是基本類型的數組都擴展了 Object 類。
equals 方法
Object 類是 Java 中所有類的始祖, 在 Java 中每個類都是由它擴展而來的。
?
1 Java 語言規范要求 equals 方法具有下面的特性:
? ? 1 ) 自反性: 對于任何非空引用 x, x.equals(x)?應該返回 true。
? ? 2 ) 對稱性: 對于任何引用 x 和 y, 當且僅當 y.equals(x) 返回 true, x.equals(y) 也應該返回 true。
? ? 3 ) 傳遞性: 對于任何引用 x、 y 和 z, 如果 x.equals(y) 返 N true, y.equals(z) 返回 true,x.equals(z) 也應該返回 true。
? ? 4 ) 一致性: 如果 x 和 y 引用的對象沒有發生變化,反復調用 x.eqimIS(y) 應該返回同樣的結果。
? ? 5 ) 對于任意非空引用 x, x.equals(null) 應該返回 false,
2 使用 Class 還是使用 instanceof ?
? ?如果子類能夠擁有自己的相等概念, 則對稱性需求將強制采用 getClass 進行檢測。
? ?如果由超類決定相等的概念,那么就可以使用 imtanceof進行檢測, 這樣可以在不同子類的對象之間進行相等的比較。
?
3 編寫一個完美的 equals 方法的建議:
1 ) 顯式參數命名為 otherObject, 稍后需要將它轉換成另一個叫做 other 的變量。
2 ) 檢測 this 與 otherObject 是否引用同一個對象:
?if (this = otherObject) return true;這條語句只是一個優化。實際上,這是一種經常采用的形式。因為計算這個等式要比一個一個地比較類中的域所付出的代價小得多。
3 ) 檢測 otherObject 是否為 null, 如 果 為 null, 返 回 false。這項檢測是很必要的。
if (otherObject = null) return false;4 ) 比較 this 與 otherObject 是否屬于同一個類。如果 equals 的語義在每個子類中有所改變,就使用 getClass 檢測:
if (getClass() != otherObject.getCIassO) return false;如果所有的子類都擁有統一的語義,就使用 instanceof 檢測:
if (!(otherObject instanceof ClassName)) return false;5 ) 將 otherObject 轉換為相應的類類型變量:
ClassName other = (ClassName) otherObject6 ) 現在開始對所有需要比較的域進行比較了。使用= 比較基本類型域,使用 equals 比較對象域。如果所有的域都匹配, 就返回 true; 否 則 返 回 false。
return fieldl == other.field && Objects.equa1s(fie1d2, other.field2)如果在子類中重新定義 equals, 就要在其中包含調用 super.equals(other。)
提示:對于數組類型的域, 可以使用靜態的 Arrays.equals 方法檢測相應的數組元素是否相等
4 擴展:
java.util.Arrays
? ? ? static Boolean equals(type[] a , type[] b) 5.0
? ? 如果兩個數組長度相同, 并且在對應的位置上數據元素也均相同, 將返回 true。 數組的元素類型可以是 Object、 int、 long、 short、 char、 byte、 boolean、 float 或 double 。
java.util.Objects
? ? ? static boolean equals(Object a, Object b)
? ? 如果 a 和 b 都為 null, 返回 true ; 如果只有其中之一為 null, 則返回 false ; 否 則 返 回a.equals(b)。
5 Demo:
public class Employee{...punlic boolean equals(Object otherObject){// 1. 引用檢測if(this == otherObject) return true;// 2. 檢測參數 otherObject 是否為空if(otherObject == null) return false;// 3. 比較 this 與 otherObject 是否為同一類if(getClass() != otherObject.getClass()) return false;// 4. 將 otherObject 轉換為相應的類型變量Employee other = (Employee) otherObject;// 5. 最后進行所有的域的比較return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);}... }?
總結
以上是生活随笔為你收集整理的《Java 核心技术卷1 第10版》学习笔记------Object类的 equals 方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Java 核心技术卷1 第10版》学习
- 下一篇: 《Java 核心技术卷1 第10版》学习