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

hashCode&equals

1、先看下 equals==

  • == 運算子

    在Java中 == 常用於比較兩個基本資料型別的關係(比較的是變數的值)。如果使用 == 比較兩個物件(引用型別),那麼它比較的是兩個物件的記憶體地址(堆記憶體)。

  • equals方法(預設由 == 實現)

    public boolean equals(Object obj) {
        return (this == obj);
    }
    

    equals方法是Object類的方法,也就是任何類都可以重寫這個方法(每個類都繼承自Object類),equals方法的特殊之處就在於此,如果想比較兩個物件的內容是否相同,你就可以重寫equals方法,並自定義比較規則。

2、再來看一下hashCode()

  • hashCode()

    此方法也是由Object類繼承過來

    public native int hashCode();
    

    Object類中的hashCode()方法返回物件在記憶體中地址轉換成的一個int值,所以如果沒有重寫hashCode()方法,任何物件的hashCode()方法都是不相等的。

  • 為什麼需要hashCode這個方法?

    這個方法主要用與對於雜湊儲存的集合中,每次向雜湊集合中新增資料,集合都會比較當前資料在集合中是否已經存在,如果此時集合的資料量比較大時,使用equals方式比較將會非常耗時,而hashCode方法主要就是解決這個問題的,使用hashCode

    可以快速的得到資料的雜湊碼,如果兩個物件的雜湊碼不相等,兩個物件一定不相等,此時就可以直接加入。如果

    兩個物件的雜湊碼相等的情況下(存在雜湊衝突的情況,兩個不同的物件產生了相同的雜湊碼),再去呼叫equals方法比較是否相等,最終是否新增成功由equals的返回值決定。

    如果不重寫hashCode,對於相同內容的物件的資料存入雜湊儲存的集合(hashSetLinkedHashSet)中時,還會呼叫最原始的hashCode,發現他們的hashCode是不相等的,從而將者兩個相同內容的物件資料存入集合中,這不是我們期待的情況。

    如果重寫equals時,也重寫hashCode,再進行上述情況時,對於相同內容的物件,他們的hashCode

    是相同的,所以新增第二物件時,就會失敗,這也是我們期待的。

參考