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
中