首頁  >  文章  >  Java  >  Object類別的深入解析(圖文)

Object類別的深入解析(圖文)

不言
不言轉載
2019-03-02 14:37:212753瀏覽

這篇文章帶給大家的內容是關於Object類別的深入解析(圖文),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

Object類別有哪些方法

registerNatives()【底層實作、不研究】hashCode()equals(Object obj)clone()toString() notify()notifyAll()wait(long timeout)【還有重載了兩個】finalize()Object一共有11個方法,其中一個為底層的實作registerNatives(),其中兩個wait()和wait(long timeout, int nanos)重載方法。還有一個屬性:傳回字節碼檔案物件

hashCode

public native int hashCode();

##由native方法底層實作了

equals

public boolean equals(Object obj) {
    return (this == obj);
}

直接判斷記憶體位址了

想要更清楚它們究竟是做什麼的,我們來讀讀它的註解:

Object類別的深入解析(圖文)

Object類別的深入解析(圖文)

根據註解我們可以總結以下的要點:

    #重寫
  • equals()方法,就必須重寫hashCode()的方法
  • equals()方法預設是比較物件的位址,使用的是==等值運算符
  • hashCode()方法對底層是散列表的物件有提升效能的功能
  • 同一個物件(如果該物件沒有被修改):那麼重複調用
  • hashCode()那麼回傳的int是相同的!
  • hashCode()方法預設是由物件的位址轉換而來的
  • equals()方法還有5個預設的原則:
    • 自反性--->呼叫
    • equals()返回的是true,無論這兩個物件誰呼叫equals()都好,回傳的都是true
    • 一致性--->只要物件沒有被修改,那麼多次呼叫還是回傳對應的結果!
    • 傳遞性--->
    • x.equals(y)y.equals(z)都回傳true,那麼可以得到: x.equals(z)傳回true
    • 對稱性--->
    • x.equals(y)y.equals(x)結果應該是相等的。
    • 傳入的參數為null,回傳的是false
為啥說hashCode()以散列表為底層帶來效能的提升是很容易理解的。我們再來回顧一下HashMap的插入:

Object類別的深入解析(圖文)如果hash值都不相等,那麼可以直接判斷該key是不相等的了!

toString

toString方法主要是用來

標識該物件的

Object類別的深入解析(圖文)

clone

    clone方法用於物件的克隆,一般想要克隆出的物件是
  • 獨立的(與原有的物件是分開的)
  • 深拷貝指的是該物件的成員變數(如果是可變引用)都應該克隆一份,淺拷貝指的是成員變數沒有被複製一份
  • 如何複製物件?

      複製的物件要
    • 實作Cloneable介面
    • #重寫clone方法,最好修飾成public
wait & notify & notifyAll

wait和notify方法其實就是Java給我們提供讓

線程之間通訊的API。

    無論是wait、notify或notifyAll()都需要
  • 由監聽器物件(鎖定物件)來進行呼叫
    • 簡單來說:
    • 他們都是在同步程式碼區塊中呼叫的,否則會拋出例外!
  • notify()喚醒的是在等待佇列的某個執行緒(不確定會喚醒哪一個),notifyAll( )喚醒的是等待佇列所有執行緒
  • 導致
  • wait()的執行緒被喚醒可以有4種情況
    • #該執行緒被中斷
    • wait()時間到了
    • notify()喚醒
    • notifyAll()喚醒
  • 呼叫
  • wait()的執行緒會釋放掉鎖定

為什麼wait和notify在Object方法上#

  • 因為我們的鎖定是物件鎖定【要是忘記的同學可回顧:Java鎖定機制來了解】,每個物件都可以成為鎖定。 讓目前執行緒等待某個物件的鎖,當然應該透過這個物件來操作了
  • 鎖定物件是任意的,所以這些方法必須定義在Object類中

Thread.sleep()Object.wait()

二者都可以暫停當前線程,釋放CPU控制權。

  • 主要的差異在於Object.wait()在釋放CPU同時,釋放了物件鎖定的控制
  • Thread.sleep()沒有對鎖定釋放

但是要注意的是:

notify方法呼叫後,被喚醒的執行緒不會立刻獲得到鎖定物件。而是等待notify的synchronized程式碼區塊執行完之後才會取得鎖定物件

finalize

finalize()`方法將在垃圾回收器清除對象之前調用,但該方法不知道何時調用,具有不定性

一般我們都不會重寫它~
一個物件的finalize()方法只會被呼叫一次,而且finalize()被呼叫不意味著gc會立即回收該對象,所以有可能調用finalize()後,該對象又不需要被回收了,然後到了真正要被回收的時候,因為前面呼叫過一次,所以不會呼叫finalize(),產生問題。

Object類別的深入解析(圖文)

#

以上是Object類別的深入解析(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除