這篇文章帶給大家的內容是關於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();
public boolean equals(Object obj) { return (this == obj); }
#重寫
為啥說hashCode()以散列表為底層帶來效能的提升是很容易理解的。我們再來回顧一下HashMap的插入:- 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)
傳入的參數為null,回傳的是false和
y.equals(x)結果應該是相等的。
如果hash值都不相等,那麼可以直接判斷該key是不相等的了!
toStringtoString方法主要是用來標識該物件的
clonewait & notify & notifyAllwait和notify方法其實就是Java給我們提供讓clone方法用於物件的克隆,一般想要克隆出的物件是
- 獨立的(與原有的物件是分開的)
深拷貝指的是該物件的成員變數(如果是可變引用)都應該克隆一份,淺拷貝指的是成員變數沒有被複製一份- 如何複製物件?
複製的物件要
- 實作Cloneable介面
- #重寫clone方法,最好修飾成public
線程之間通訊的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()被呼叫不意味著gc會立即回收該對象,所以有可能調用finalize()後,該對象又不需要被回收了,然後到了真正要被回收的時候,因為前面呼叫過一次,所以不會呼叫finalize(),產生問題。 #
以上是Object類別的深入解析(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!