學習Object類



學習Object類

Object作爲一個超類,擁有11個基本方法

如下:

protected Object clone()創建並返回此對象的一個副本。 

boolean equals(Object obj)指示其他某個對象是否與此對象“相等”。 

protected void finalize()當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。 

Class<?> getClass()返回此 Object 的運行時類。 

int hashCode()返回該對象的哈希碼值。 

void notify()喚醒在此對象監視器上等待的單個線程。 

void notifyAll()喚醒在此對象監視器上等待的所有線程。 

String toString()返回該對象的字符串表示。 

void wait()在其他線程調用此對象的 notify() 方法或 notifyAll() 方法前,導致當前線程等待。 

void wait(long timeout)在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前線程等待。 

void wait(long timeout, int nanos)在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量前,導致當前線程等待。

其中大家經常用到的就是:

equals(),hashCode(),toString();

下面結合官方文檔分析一下這三個方法:

hashCode 的常規協定是: 

· 在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。 

· 如果根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。 

· 如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用 hashCode 方法 要求一定生成不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同整數結果可以提高哈希表的性能。 

Equals():當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。

equals(Object obj)方法用來判斷兩個對象是否“相同”,如果“相同”則返回true,否則返回false。 

hashcode()方法返回一個int數,在Object類中的默認實現是“將該對象的內部地址轉換成一個整數返回”。

因此在子類中

若重寫equals(Object obj)方法,有必要重寫hashcode()方法,確保通過equals(Object obj)方法判斷結果爲true的兩個對象具備相等的hashcode()返回值。簡單地說就是:兩個相等的對象,應該具有相等的hashcode。如果你非要寫一個類讓equals(Object obj)返回true而hashcode()返回兩個不相等的值,編譯和運行都是不會報錯的。但這樣程序就存在了一個Bug

如果equals(Object obj)返回false,並不要求對這兩個對象調用hashcode()方法得到兩個不相同的數。簡單的說就是:“如果兩個對象不相同,他們的hashcode也可能相同”。 

根據以上分析我們可以得出以下結論

1、如果兩個對象equals,Java運行時環境會認爲他們的hashcode一定相等。 

2、如果兩個對象不equals,他們的hashcode有可能相等。 

3、如果兩個對象hashcode相等,他們不一定equals。 

4、如果兩個對象hashcode不相等,他們一定不equals。 

因此如果比較兩個對象是否相等我們應該先判斷hashcode是否相等,再判斷是否equals

toString()

Java默認是不調用toString方法的,所以當一個類沒有重寫toString方法,直接輸出對象時,顯示出來的結果是一串數值。但當我們用System.out.println();這個方法在控制檯打印出對象時,看到的是一串字符,這是因爲System.out.println();這個方法默認就會調用一個繼承自Object類型對象的toString方法

 

 

 

發佈了35 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章