Java equals和hashCode的理解

2021-06-27 11:42:06 字數 1332 閱讀 1277

我們一般使用equals都是為了比較物件的內容,而object裡面的equals方法卻是比較物件的引用,如下:

public boolean equals(object obj)
所以當我們想要比較的是物件的內容時,需要重寫equals方法,假設user類中有string name , int age 兩個字段,用eclipse自動生成的

equals方法寫法如下:

public boolean equals(object obj)  else if (!name.equals(other.name))

return false;

return true;

}

乙個測試用例

public class test 

}

列印true。如果把user類重寫的equals方法去掉,此時user1.equals()呼叫的是object類的equals方法,比較的是引用而不是內容,user1和user2的引用明顯不同,故列印false。常用的equals方法比較的是物件的內容,即物件要屬於同乙個類且字段屬性相等才相等。

hashcode主要用於類集框架。假設我們對乙個類不重寫hashcode方法,物件呼叫hashcode方法時則呼叫的是object類的hashcode方法:

public native int hashcode();
生成的雜湊值都是不相同的,而如果我們重寫了hashcode方法,對於內容相同的物件則可以生成相同的雜湊值。

至於hashcode方法寫法,我們一般也不需要記住,直接用工具生成就好了。

測試用例:

public class test 

}

列印結果:

-1106625705

-1106625705

9611

value

把user類重寫的hashcode方法去掉後列印:

31168322

17225372

5433634

2null

沒有重寫hashcode方法時:兩個物件即使內容相等,也生成不同的雜湊值,所以都可以add進set裡面去,我們知道hashset是不可以有重複的元素的,所以這就是為什麼必須要重寫hashcode的原因;同理對於hashmap雖然put和get的是同樣的key,但由於雜湊值不同,而被視作了不同的key,所以無法取出來。

重寫hashcode方法後,兩個相等的物件會生成相同的雜湊值。

Java equals和 的區別

好多人搞不清equals和 的區別,今天我來 一下,如有誤請批評指正。我們常常簡單理解為 運算子用來比較兩個基本資料型別的數值是否相同,而equals 方法用來比較兩個物件是否相同。這樣的理解也可以,但我們還是要看看更深層次的含義,那樣會更加清晰 1,對於基本資料型別,byte,short,char...

JAVA equals和「 」的區別

首先要明白什麼基本型別和引用型別 基本型別 比較的就是值是否相同。和 equals 被重寫之前 都是屬於引用型別。但是equals使用時比較靈活,大多數被重寫使用。實際上jdk中,string math等封裝類都對equals 方法進行了重寫。如果建立物件定義資料型別 比如 string a new...

Java equals 方法重寫

equals 方法的要求 自反性 對於任何非空的引用x,x.equals x 都應該返回true 對稱性 對於任何引用x和y,當且僅當x.equals y 返回true時,y.equals x 也應該返回true 傳遞性 對於任何引用x y z,如果x.equals y 返回true,y.equal...