1. 程式人生 > >Object類所有方法詳解——面試

Object類所有方法詳解——面試

工作後往往忽略一些基礎知識的複習,而在面試中常常被這些問題弄得抓耳撓腮,明明知道問題簡單卻就是回答不出來,小二在這也是感同身受,最近先整理幾篇基礎知識的博文共以後自己複習;

1.getClass

public final Class<?> getClass()

作用:返回此 Object 的執行時類。返回的 Class 物件是由所表示類的 static synchronized 方法鎖定的物件。 實際結果型別是 Class<? extends |X|>,其中 |X| 表示清除表示式中的靜態型別,該表示式呼叫 getClass。

2.hashCode

public int hashCode()

作用:返回該物件的雜湊碼值。支援此方法是為了提高雜湊表(例如 java.util.Hashtable 提供的雜湊表)的效能; hashCode 的常規協定是 :

  • 在 Java 應用程式執行期間,在對同一物件多次呼叫 hashCode 方法時,必須一致地返回相同的整數,前提是將物件進行 equals() 比較時所用的資訊沒有被修改。從某一應用程式的一次執行到同一應用程式的另一次執行,該整數無需保持一致。
  • 如果根據 equals(Object) 方法,兩個物件是相等的,那麼對這兩個物件中的每個物件呼叫 hashCode 方法都必須生成相同的整數結果。
  • 如果根據 equals(java.lang.Object) 方法,兩個物件不相等,那麼對這兩個物件中的任一物件上呼叫 hashCode 方法不 要求一定生成不同的整數結果。但是,程式設計師應該意識到,為不相等的物件生成不同整數結果可以提高雜湊表的效能。

實際上,由 Object 類定義的 hashCode 方法確實會針對不同的物件返回不同的整數。(這一般是通過將該物件的內部地址轉換成一個整數來實現的,但是 JavaTM 程式語言不需要這種實現技巧。)

3.equals

public boolean equals(Object obj)

作用:指示其他某個物件是否與此物件“相等”。 equals 方法在非空物件引用上實現相等關係:

  • 自反性:對於任何非空引用值 x,x.equals(x) 都應返回 true。
  • 對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。
  • 傳遞性:對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true。
  • 一致性:對於任何非空引用值 x 和 y,多次呼叫 x.equals(y) 始終返回 true 或始終返回 false,前提是物件上 equals 比較中所用的資訊沒有被修改。
  • 對於任何非空引用值 x,x.equals(null) 都應返回 false。

Object 類的 equals 方法實現物件上差別可能性最大的相等關係;即,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個物件時,此方法才返回 true(x == y 具有值 true)。 注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。

4.toString

public String toString()

作用:返回該物件的字串表示。通常,toString 方法會返回一個“以文字方式表示”此物件的字串。結果應是一個簡明但易於讀懂的資訊表示式。建議所有子類都重寫此方法。 Object 類的 toString 方法返回一個字串,該字串由類名(物件是該類的一個例項)、at 標記符“@”和此物件雜湊碼的無符號十六進位制表示組成。換句話說,該方法返回一個字串,它的值等於:

getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

5.wait

public final void wait(long timeout) throws InterruptedException 
//timeout - 要等待的最長時間

作用:在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前執行緒等待。當前執行緒必須擁有此物件監視器。 介紹:此方法導致當前執行緒(稱之為 T)將其自身放置在物件的等待集中,然後放棄此物件上的所有同步要求。出於執行緒排程目的,在發生以下四種情況之一前,執行緒 T 被禁用,且處於休眠狀態:

  • 其他某個執行緒呼叫此物件的 notify 方法,並且執行緒 T 碰巧被任選為被喚醒的執行緒。
  • 其他某個執行緒呼叫此物件的 notifyAll 方法。
  • 其他某個執行緒中斷執行緒 T。
  • 大約已經到達指定的實際時間。

但是,如果 timeout 為零,則不考慮實際時間,在獲得通知前該執行緒將一直等待。然後,從物件的等待集中刪除執行緒 T,並重新進行執行緒排程。然後,該執行緒以常規方式與其他執行緒競爭,以獲得在該物件上同步的權利;一旦獲得對該物件的控制權,該物件上的所有其同步宣告都將被恢復到以前的狀態,這就是呼叫 wait 方法時的情況。然後,執行緒 T 從 wait 方法的呼叫中返回。所以,從 wait 方法返回時,該物件和執行緒 T 的同步狀態與呼叫 wait 方法時的情況完全相同。 在沒有被通知、中斷或超時的情況下,執行緒還可以喚醒一個所謂的虛假喚醒 (spurious wakeup)。雖然這種情況在實踐中很少發生,但是應用程式必須通過以下方式防止其發生,即對應該導致該執行緒被提醒的條件進行測試,如果不滿足該條件,則繼續等待。換句話說,等待應總是發生在迴圈中,如下面的示例:

synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
     }

如果當前執行緒在等待之前或在等待時被任何執行緒中斷,則會丟擲 InterruptedException。在按上述形式恢復此物件的鎖定狀態時才會丟擲此異常。 注意由於 wait 方法將當前執行緒放入了物件的等待集中,所以它只能解除此物件的鎖定;可以同步當前執行緒的任何其他物件線上程等待時仍處於鎖定狀態。 此方法只應由作為此物件監視器的所有者的執行緒來呼叫。有關執行緒能夠成為監視器所有者的方法的描述,請參閱 notify 方法。

6.notify

public final void notify()

作用:喚醒在此物件監視器上等待的單個執行緒。如果所有執行緒都在此物件上等待,則會選擇喚醒其中一個執行緒。 介紹:選擇是任意性的,並在對實現做出決定時發生。執行緒通過呼叫其中一個 wait 方法,在物件的監視器上等待。 直到當前執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒。被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭;例如,喚醒的執行緒在作為鎖定此物件的下一個執行緒方面沒有可靠的特權或劣勢。

此方法只應由作為此物件監視器的所有者的執行緒來呼叫。通過以下三種方法之一,執行緒可以成為此物件監視器的所有者:

  • 通過執行此物件的同步例項方法。
  • 通過執行在此物件上進行同步的 synchronized 語句的正文。
  • 對於 Class 型別的物件,可以通過執行該類的同步靜態方法。 一次只能有一個執行緒擁有物件的監視器。

7.notifyAll

public final void notifyAll()

作用:喚醒在此物件監視器上等待的所有執行緒。執行緒通過呼叫其中一個 wait 方法,在物件的監視器上等待。 介紹:直到當前執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒。被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭;例如,喚醒的執行緒在作為鎖定此物件的下一個執行緒方面沒有可靠的特權或劣勢。

8.clone

protected Object clone() throws CloneNotSupportedException

作用:建立並返回此物件的一個副本。“副本”的準確含義可能依賴於物件的類。

9.finalize

protected void finalize()  throws Throwable

作用: 當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法。子類重寫 finalize 方法,以配置系統資源或執行其他清除。 介紹

  • finalize 的常規協定是:當 JavaTM 虛擬機器已確定尚未終止的任何執行緒無法再通過任何方法訪問此物件時,將呼叫此方法,除非由於準備終止的其他某個物件或類的終結操作執行了某個操作。finalize 方法可以採取任何操作,其中包括再次使此物件對其他執行緒可用;不過,finalize 的主要目的是在不可撤消地丟棄物件之前執行清除操作。例如,表示輸入/輸出連線的物件的 finalize 方法可執行顯式 I/O 事務,以便在永久丟棄物件之前中斷連線。
  • Object 類的 finalize 方法執行非特殊性操作;它僅執行一些常規返回。Object 的子類可以重寫此定義。
  • Java 程式語言不保證哪個執行緒將呼叫某個給定物件的 finalize 方法。但可以保證在呼叫 finalize 時,呼叫 finalize 的執行緒將不會持有任何使用者可見的同步鎖定。如果 finalize 方法丟擲未捕獲的異常,那麼該異常將被忽略,並且該物件的終結操作將終止。
  • 在啟用某個物件的 finalize 方法後,將不會執行進一步操作,直到 Java 虛擬機器再次確定尚未終止的任何執行緒無法再通過任何方法訪問此物件,其中包括由準備終止的其他物件或類執行的可能操作,在執行該操作時,物件可能被丟棄。
  • 對於任何給定物件,Java 虛擬機器最多隻呼叫一次 finalize 方法。
  • finalize 方法丟擲的任何異常都會導致此物件的終結操作停止,但可以通過其他方法忽略它。