Java核心技術讀書筆記5-2 Object類及其原生方法
2.Object類
2.1 Object類是所有類的始祖,包括陣列和其他類
2.2 equals方法
對於Java,==是比較記憶體地址是否相同,其實,equals方法來自於Object,其原始含義也是比較記憶體地址:
public boolean equals(Object obj) {
return (this == obj);
}
但這種形式與==的功能是一樣的,一般意義不大。所以很多類庫對equals方法進行了重寫。重寫後的equals方法一般用於比較物件的值是否相同,即變數中存的地址指向的物件的值是否相同。如String類的重寫:
public boolean equals(Object anObject) { if (this == anObject) { //若是同一物件,值自然相同 return true; } if (anObject instanceof String) { //若都是String才可比較,否則直接返回false String aString = (String)anObject; if (!COMPACT_STRINGS || this.coder == aString.coder) { //不是緊湊字串或編碼相同才可比較值,否則返回false return StringLatin1.equals(value, aString.value); //比較值 } } return false; }
直接比較值是比較耗時的,因此,重寫equals方法時應按如下步驟比較以提升效率。(既然是重寫方法,引數型別一定只能是唯一的一個Object類)
- 比較this與other是否是同一個物件,若是返回true
- 檢測other是否為空,若是返回false;
- 是否同屬於一個Class/是否同屬於一個父類,不是則返回false。此條是按需求選的,例如:如果有需求認為兩個類的id域相同就認為相等,就不用滿足這個同類條件。
- 比較具體的域。
注1:在-128~127範圍的整形包裝類,使用字串字面值的字串物件,如果同值用==比較也會返回true。前者是因為JVM快取,後者是因為字串池。
注2:陣列型別可用Arrays.equals(type[] a, type[] b)方法檢測陣列元素,Objects.equals(Object a, Object b)方法可以檢測兩個物件是否為null,同null為true,若只有一方為null返回false,否則返回a.equals(b)
2.3 hashCode方法
雜湊碼(hash code)是由物件匯出的一個沒有規律的整型值。在Object中hashcode方法預設放回物件的地址(也保證了和equals方法的返回結果一致)。若重寫equals方法必須重寫hashcode方法,一個物件的雜湊碼必須和equals方法一致,即兩個具有相同雜湊碼的物件使用equals方法返回結果必須為true,反之亦然。
一些獲得hashcode的方法:
Object.hashCode();
Objects.hash(objects...);
Objects.hashCode(Object obj);
基本型別包裝類.hashcode(一個基本資料型別);
Arrays.hashCode(type[] array);
2.4 toString方法
一般會列印類名資訊和域的值,若有超類還可以呼叫超類的toString方法和類資訊。
列印一個變數或使用+連線了字串時,系統會自動呼叫toString方法。
列印陣列和二維陣列元素可以使用Arrays.toString(type[] array)和Arrays.deepToString(type[][] array)