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
,對於相同內容的物件的資料存入雜湊儲存的集合(hashSet
、LinkedHashSet
)中時,還會呼叫最原始的hashCode
,發現他們的hashCode
是不相等的,從而將者兩個相同內容的物件資料存入集合中,這不是我們期待的情況。如果重寫equals時,也重寫
hashCode
,再進行上述情況時,對於相同內容的物件,他們的hashCode
參考
-
[如何解決雜湊衝突的問題?](