每天記錄學習的新知識 : hashcode 和 equals

2020-08-10 18:16:23

參考地址

參考地址:淺談Java中的hashcode方法

hashCode 與 equals

hashCode

hashCoedObject類裏面的方法,返回值是一個物件的雜湊碼

方法:

    @Override
    public int hashCode() {
        return super.hashCode();
    }
       
    public int hashCode() {
        throw new RuntimeException("Stub!");
    }

沒有具體實現是因爲這是本地方法。
本地方法 --> 就是用關鍵字native修飾的方法,通過這些方法可以呼叫java以外的程式,例如c語言寫的程式

Native具體方法:Java語言中Object物件的hashCode()取值的底層演算法是怎樣實現的?,object hashcode
具體實現講解跳轉到–>Java中hashCode的實現

那麼最終雜湊值返回的是什麼?

有些朋友誤以爲預設情況下,hashCode返回的就是物件的儲存地址,事實上這種看法是不全面的,確實有些JVM在實現時是直接返回物件的儲存地址,但是大多時候並不是這樣,只能說可能儲存地址有一定關聯。

那麼雜湊值都可以是哪些值呢?

  1. 亂數
  2. 基於記憶體地址生成
  3. 固定值:1,用來測試
  4. 自增
  5. 利用位移生成亂數

equals

equals的作用是比較物件(地址)

hashCode 與 equals的比較

結論:

equals比較相等,hashCode 肯定相等;hashCode 比較相等,equals不一定相等。

爲啥?

  1. 如果equals比較的結果是兩個物件地址相同,那麼他們的值肯定是相等的。他們的值相等時,同一個JVM上,雜湊值肯定相等。

  2. 雜湊值相等的兩個物件地址一定相等嗎?不見得。因爲雜湊值是通過特定演算法計算出來滴。可能兩個物件的值算出相同的雜湊值,也可能算出不同的雜湊值。

擴充套件下

我們知道了雜湊值是什麼東西了,或者怎麼實現滴,那麼:

雜湊值有什麼用呢?

舉個栗子:

有十個人,你想知道小明在不在裏面,可以用For回圈來實現。(List實現)

也可以用雜湊值,將十個人的人名在存入的時候,存入雜湊值,以雜湊值爲KEY,即可快速知道,小明存不存在其中。(HashMap實現)

Obj中的hashCode()有啥用?

支援此方法是爲了提高雜湊表(例如 java.util.Hashtable 提供的雜湊表)的效能。