兩個對象用equals方法比較為true,它們的Hashcode值相同嗎?


兩個對象用equals方法比較為true,它們的Hashcode值相同嗎?

       答:不一定相同。正常情況下,因為equals()方法比較的就是對象在內存中的值,如果值相同,那么Hashcode值也應該相同。但是如果不重寫hashcode方法,就會出現不相等的情況。

下面的話來自JDK:

        hashCode 
        public int hashCode()返回該對象的哈希碼值。支持此方法是為了提高哈希表(例如 Java.util.Hashtable 提供的哈希表)的性能。
        hashCode 的常規協定是: 
        在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。 
        如果根據 equals(Object) 方法,兩個對象是相等的,那么對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。 
        如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那么對這兩個對象中的任一對象上調用 hashCode 方法不 要求一定生成不同的整數結果。但是,程序員應該意識到,為不相等的對象生成不同整數結果可以提高哈希表的性能。 
        實際上,由 Object 類定義的 hashCode 方法確實會針對不同的對象返回不同的整數。(這一般是通過將該對象的內部地址轉換成一個整數來實現的,但是 JavaTM 編程語言不需要這種實現技巧。) 


equals 
public boolean equals(Object obj)指示其他某個對象是否與此對象“相等”。 
equals 方法在非空對象引用上實現相等關系: 

自反性:對於任何非空引用值 x,x.equals(x) 都應返回 true。 
對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。 
傳遞性:對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那么 x.equals(z) 應返回 true。 
一致性:對於任何非空引用值 x 和 y,多次調用 x.equals(y) 始終返回 true 或始終返回 false,前提是對象上 equals 比較中所用的信息沒有被修改。 
對於任何非空引用值 x,x.equals(null) 都應返回 false。 
Object 類的 equals 方法實現對象上差別可能性最大的相等關系;即,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才返回 true(x == y 具有值 true)。 

注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。 

 

       看看紅色的部分,說明的是JDK規定當你調用equals方法比較兩個對象相等時,他們調用hashcode方法時,都應該返回相同的整數值,也就是hashcode相等。記住,是應該相同。為什么應該?下面這段紅色字體說了,必須重寫hashcode方法維護...協定!如果你不重寫,那么就不能保證hashcode返回相同結果。

換句話說:重寫equals方法時請必須重寫hashcode,以保證equals方法相等時兩個對象hashcode返回相同的值。如果你不按照規范來,就不一定相同了。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM