我們一般使用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...