1. 程式人生 > 其它 >hashCode與equals

hashCode與equals

是什麼?
hashcode()Object類中的一個方法。

public native int hashCode();

可以看到,這是使用native關鍵字呼叫底層C++實現的產生隨機數的函式。、
有這樣一些生成方法

  • 隨機數
  • 基於記憶體地址生成
  • 固定值:1,用來測試
  • 自增
  • 利用位移生成隨機數

這就帶來一個問題,Object中並沒有一個值來儲存hashcode,那麼每次呼叫hashcode豈不是會變化?但是如下圖所示,是不變的。這是因為該資訊直接被儲存在了物件頭的標記字(MarkWord)中
如果進入各種鎖狀態,那麼會快取在其他地方,一般是獲取鎖的執行緒裡面儲存,恢復無鎖(即釋放鎖)會改回原有的雜湊值。

一個

Java物件包含如下三個部分:

  • 物件頭
  • 例項資訊
  • 對齊資訊

equal來自於超類Object,預設是==,需要重寫。

為什麼?
說到這兩個,我們都知道,重寫。
重寫是為了實現我們的目的。我們知道,hashMap儲存物件時,是使用到equalhashcode的。那麼一步一步來:

  • 為什麼不使用equal或者hashcode
    沒有重寫,和我們使用hashMap的目標不一致。兩者都不涉及物件的內容比較。
  • 為什麼要重寫equal還要重寫hashcode,僅重寫其中一個不就行了?
    首先,這是因為hashMap的策略就是先使用hashcode判別,再使用equal判別。