- registerNatives()【底層實現、不研究】
- hashCode()
- equals(Object obj)
- clone()
- toString()
- notify()
- notifyAll()
- wait(long timeout)【還有重載了兩個】
- finalize()
registerNatives()
,其中兩個wait()
和wait(long timeout, int nanos)
重載方法。public native int hashCode();由native方法底層實現了java
public boolean equals(Object obj) { return (this == obj); }直接判斷內存地址了性能
根據註釋咱們能夠總結如下的要點:this
- 重寫
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的插入:
- clone方法用於對象的克隆,通常想要克隆出的對象是獨立的(與原有的對象是分開的)
- 深拷貝指的是該對象的成員變量(若是是可變引用)都應該克隆一份,淺拷貝指的是成員變量沒有被克隆一份
如何克隆對象?spa
- 克隆的對象要實現Cloneable接口
- 重寫clone方法,最好修飾成public
wait和notify方法其實就是Java給咱們提供讓線程之間通訊的API。線程
- 不管是wait、notify仍是notifyAll()都須要由監聽器對象(鎖對象)來進行調用
- 簡單來講:他們都是在同步代碼塊中調用的,不然會拋出異常!
notify()
喚醒的是在等待隊列的某個線程(不肯定會喚醒哪一個),notifyAll()
喚醒的是等待隊列全部線程- 致使
wait()
的線程被喚醒能夠有4種狀況
- 該線程被中斷
wait()
時間到了- 被
notify()
喚醒- 被
notifyAll()
喚醒- 調用
wait()
的線程會釋放掉鎖
爲何wait和notify在Object方法上code
- 由於咱們的鎖是對象鎖【要是忘記的同窗可回顧:Java鎖機制瞭解一下】,每一個對象均可以成爲鎖。讓當前線程等待某個對象的鎖,固然應該經過這個對象來操做了
- 鎖對象是任意的,因此這些方法必須定義在Object類中
Thread.sleep()與
Object.wait()對象
兩者均可以暫停當前線程,釋放CPU控制權。接口
- 主要的區別在於
Object.wait()
在釋放CPU同時,釋放了對象鎖的控制。- 而
Thread.sleep()
沒有對鎖釋放
可是要注意的是:隊列
notify方法調用後,被喚醒的線程 不會立馬得到到鎖對象。而是等待notify的synchronized代碼塊 執行完以後纔會得到鎖對象
finalize()`方法將在垃圾回收器清除對象以前調用,但該方法不知道什麼時候調用,具備不定性圖片
通常咱們都不會重寫它~