hashCode與equals
阿新 • • 發佈:2021-08-24
是什麼?
hashcode()
是Object
類中的一個方法。
public native int hashCode();
可以看到,這是使用native關鍵字呼叫底層C++實現的產生隨機數的函式。、
有這樣一些生成方法:
- 隨機數
- 基於記憶體地址生成
- 固定值:1,用來測試
- 自增
- 利用位移生成隨機數
這就帶來一個問題,Object中並沒有一個值來儲存hashcode,那麼每次呼叫hashcode豈不是會變化?但是如下圖所示,是不變的。這是因為該資訊直接被儲存在了物件頭的標記字(MarkWord)中
如果進入各種鎖狀態,那麼會快取在其他地方,一般是獲取鎖的執行緒裡面儲存,恢復無鎖(即釋放鎖)會改回原有的雜湊值。
一個 Java物件包含如下三個部分:
- 物件頭
- 例項資訊
- 對齊資訊
equal
來自於超類Object
,預設是==
,需要重寫。
為什麼?
說到這兩個,我們都知道,重寫。
重寫是為了實現我們的目的。我們知道,hashMap儲存物件時,是使用到equal
和hashcode
的。那麼一步一步來:
- 為什麼不使用
equal
或者hashcode
沒有重寫,和我們使用hashMap
的目標不一致。兩者都不涉及物件的內容比較。 - 為什麼要重寫
equal
還要重寫hashcode
,僅重寫其中一個不就行了?
首先,這是因為hashMap
的策略就是先使用hashcode
判別,再使用equal
判別。