宣告
文章皆為本人技術筆記,轉載請註明出處https://segmentfault.com/u/yzwall
#Object類別是所有類別的父類,在Java中只有基本資料型別不是物件。對於所有陣列型別(物件型別&&基本資料型別陣列)都繼承自Object類別;
Object類別中判斷兩個物件是否具有相同引用,從而判斷兩個物件是否相同;
子類別只要重寫equals方法,就必須重寫hashCode方法
// in java.lang.Object public boolean equals(Object obj) { return (this == obj); }
#自反性:A.equals(A)回傳true;
對稱性:A.equals(B)結果和B.equals(A)相同;
傳遞性:A.equals(B)為true,B.equals(C)為true,則A. equals(C)為true
一致性:對於非null引用A,B, 只要equals()比較運算所用到物件資訊不變,多次呼叫A.equals(B),結果一致;
對於任何非null引用,x.equals(null)必須傳回false;
重寫equals方法時,參數類型必須為Object類型
class myObject { private String name; private int age; ... public getName() { return this.name; } public getAge() { return this.age; } } /** * 重写equals方法demo步骤 * Effective Java中推荐方式 */ public boolean equals(Object x) { // 1. 检查x和this是否引用同一个对象 if (x == this) { return true; } // 2. 检查x对象类型是否是myObject派生 if (!(x instanceof myObject)) { return false; } // 3. 比较数据域 // 经过1,2检查,将参数转换为正确类型 myObject o = (myObject)(x); return this.name.equals(x.getName()) && this.age == (x.getAge()); }
hashCode方法
傳回物件的雜湊碼,相等物件必須傳回相等的hashCode,不同物件的hashCode盡可能不相等;
// in java.lang.Object public native int hashCode();
重寫equals不重寫hashCode,會導致「不相等物件擁有相同的hashCode」,導致集合類別HashMap
,HashSet
和Hashtable
無法運作;極端情況下,在散列表中使所有物件的hashCode都相等,所有物件都被映射到同一個桶中,散列表退化成鍊錶;
當兩個物件呼叫equal返回true,則兩個物件各自呼叫hashCode()傳回相同hashCode;
當兩個物件呼叫equal回傳false, 兩個物件各自呼叫hashCode()回傳的hashCode可以相同(雜湊衝突不能完全避免 )
Object類別中toString方法,輸出物件的「物件類別名稱@散列碼」;
文章皆為本人技術筆記,轉載請註明出處https://segmentfault.com/u/ yzwall
Object類別是所有類別的父類,在Java中只有基本資料類型不是物件。對於所有陣列型別(物件型別&&基本資料型別陣列)都繼承自Object類別;
Object類別中判斷兩個物件是否具有相同引用,從而判斷兩個物件是否相同;
子類別只要重寫equals方法,就必須重寫hashCode方法
// in java.lang.Object public boolean equals(Object obj) { return (this == obj); }
#自反性:A.equals(A)回傳true;
對稱性:A.equals(B)結果和B.equals(A)相同;
傳遞性:A.equals(B)為true,B.equals(C)為true,則A. equals(C)為true
一致性:對於非null引用A,B, 只要equals()比較運算所用到物件資訊不變,多次呼叫A.equals(B),結果一致;
對於任何非null引用,x.equals(null)必須傳回false;
重寫equals方法時,參數類型必須為Object類型
class myObject { private String name; private int age; ... public getName() { return this.name; } public getAge() { return this.age; } } /** * 重写equals方法demo步骤 * Effective Java中推荐方式 */ public boolean equals(Object x) { // 1. 检查x和this是否引用同一个对象 if (x == this) { return true; } // 2. 检查x对象类型是否是myObject派生 if (!(x instanceof myObject)) { return false; } // 3. 比较数据域 // 经过1,2检查,将参数转换为正确类型 myObject o = (myObject)(x); return this.name.equals(x.getName()) && this.age == (x.getAge()); }
hashCode方法
傳回物件的雜湊碼,相等物件必須傳回相等的hashCode,不同物件的hashCode盡可能不相等;
// in java.lang.Object public native int hashCode();
重寫equals不重寫hashCode,會導致「不相等物件擁有相同的hashCode」,導致集合類別HashMap
,HashSet
和Hashtable
無法運作;極端情況下,在散列表中使所有物件的hashCode都相等,所有物件都被映射到同一個桶中,散列表退化成鍊錶;
當兩個物件呼叫equal返回true,則兩個物件各自呼叫hashCode()傳回相同hashCode;
當兩個物件呼叫equal回傳false, 兩個物件各自呼叫hashCode()傳回的hashCode可以相同(雜湊衝突不能完全避免 )
Object類別中toString方法,輸出物件的「物件類別名稱@散列碼」;
以上是Java中Object類別的方法分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!