Object類深刻研究

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方法底層實現了java

  • equals

    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的插入:

圖片描述

  • 若是hash值都不相等,那麼能夠直接判斷該key是不相等的了!
  • toString

    • toString方法主要是用來標識該對象的
    • 圖片描述
  • clone

    • clone方法用於對象的克隆,通常想要克隆出的對象是獨立的(與原有的對象是分開的)
    • 深拷貝指的是該對象的成員變量(若是是可變引用)都應該克隆一份,淺拷貝指的是成員變量沒有被克隆一份
    • 如何克隆對象?spa

      • 克隆的對象要實現Cloneable接口
      • 重寫clone方法,最好修飾成public
  • wait & notify & notifyAll

    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

    • finalize()`方法將在垃圾回收器清除對象以前調用,但該方法不知道什麼時候調用,具備不定性圖片

      通常咱們都不會重寫它~
    • 一個對象的finalize()方法只會被調用一次,並且finalize()被調用不意味着gc會當即回收該對象,因此有可能調用finalize()後,該對象又不須要被回收了,而後到了真正要被回收的時候,由於前面調用過一次,因此不會調用finalize(),產生問題。

圖片描述

相關文章
相關標籤/搜索