1. 程式人生 > 實用技巧 >Java Object類

Java Object類

java Object 類是所有類的父類,也就是說Java的所有類都繼承了Object,子類可以使用Object的所有方法

Object 類位於 java.lang 包中,編譯時會自動匯入,我們建立一個類時,如果沒有明確繼承一個父類,那麼它就會自動繼承 Object,成為 Object 的子類。

類的方法:

  • protected Object clone():建立並返回一個物件的拷貝
  • boolean equals(Object obj):比較兩個物件是否相等
  • protected void finalize():當GC(垃圾回收器)確定不存在對該物件的有更多引用時,由物件的垃圾回收器呼叫此方法
  • Class<?> getClass():獲取物件的執行時物件的類
  • int hasCode():獲取物件的 hash 值
  • void notify():喚醒在該物件上等待的某個執行緒
  • void notifyAll():喚醒在該物件上等待的所有執行緒
  • String toString():返回物件的字串表示形式
  • void wait():讓當前執行緒進入等待狀態,知道其他執行緒呼叫此物件的notify()方法或notifyAll()方法
  • void wait(long timeout):讓當前執行緒處於等待(阻塞)狀態,直到其他執行緒呼叫此物件的 notify() 或 notifyAll() 方法,或者超過引數設定的timeout超時時間
  • void wait(long timeout, int nanos):與 wait(long timeout) 方法類似,多了一個 nanos 引數,這個引數表示額外時間(以納秒為單位,範圍是 0-999999)。 所以超時的時間還需要加上 nanos 納秒(其主要作用應該在能更精確控制等待時間)

面試題:

參考:https://blog.csdn.net/xl_1803/article/details/80445481

https://blog.csdn.net/Rex_WUST/article/details/95739535

https://blog.csdn.net/VIP_WangSai/article/details/77505517

1、為什麼重寫了equals()也要重寫hashCode()

在重寫equals時,需要重寫hashCode,不然會出現與預期不符的結果,以保證他們是相同的比較邏輯

HashMap是底層實現時陣列加連結串列。
  A.當put元素時:
   1.首先根據put元素的key獲取hashcode,然後根據hashcode算出陣列的下標位置,如果下標位置沒有元素,直接放入元素即可。
   2.如果該下標位置有元素(即根據put元素的key算出的hashcode一樣即重複了),則需要已有元素和put元素的key物件比較equals方法,如果equals不一樣,則說明可以放入進map中。這裡由於hashcode一樣,所以得出的陣列下標位置相同。所以會在該陣列位置建立一個連結串列,後put進入的元素到放連結串列頭,原來的元素向後移動。
  B.當get元素時:
根據元素的key獲取hashcode,然後根據hashcode獲取陣列下標位置,如果只有一個元素則直接取出。如果該位置一個連結串列,則需要呼叫equals方法遍歷連結串列中的所有元素與當前的元素比較,得到真正想要的物件。
可以看出如果根據hashcdoe算出的陣列位置儘量的均勻分佈,則可以避免遍歷連結串列的情況,以提高效能。
所以 要求重寫hashmap時,也要重寫equals方法。以保證他們是相同的比較邏輯

  主要是為了hashmap或者hashset避免邏輯上衝突吧,比如你建立一個Map然後new一個student物件,賦唯一屬性,如姓名身高體重,然後給定學號map.put(stu,23),當你get(stu)就能得到該學生學號,這時候你又new了一個一模一樣的人也是就student,如果不重寫hashcode,那麼會預設用hash地址演算法,得到的不一樣的hashcode值,這時候你get這個學生的學號就無法get到了,因為hashcode不同

equals方法:

Object類中的equals()方法定義如下:

public boolean equals(Object obj) {
    return (this == obj);
}
  • 基本資料型別:比較的是==兩邊值是否相等
  • 引用資料型別:比較的是==兩邊記憶體地址是否相等

所有要實現自己的equals()方法都要遵守下面幾個規則

  • 自反性:對於任何物件x,x.equals(x)應該返回true
  • 對稱性:對於任何兩個物件x和y,如果x.equals(y)返回true,那麼y.equals(x)也應該返回true
  • 傳遞性:對於多個物件x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那麼y.equals(z)也應該返回true
  • 一致性:對於兩個非空物件x,y,在沒有修改此物件的前提下,多次呼叫返回的結果應該相同
  • 對於任何非空的物件x,x.equals(null)都應該返回false

hashCode方法:

Object中的hashCode()方法是一個本地方法,返回一個int型別的雜湊值。

  • hashCode:用來計算該物件放入陣列中的哪個位置
public native int hashCode();

這兩個方法經常出現在HashMap