[java] 為什么重寫equals()必須要重寫hashCode()


本文版權歸 遠方的風lyh和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作。

在Java API文檔中關於hashCode方法有以下幾點規定(原文來自java深入解析一書)

     1 在java應用程序執行期間,如果在equals方法比較中所用的信息沒有被修改,那么在同一個對象上多次調用hashCode方法時必須一致地返回相同的整數。如果多次執行同一個應用時,不要求該整數必須相同

     2 如果兩個對象通過調用equals方法是相等的,那么這兩個對象調用hashCode方法必須返回相同的值。(重點)

     3如果兩個對象通過調用equals方法是不相等的,不要求這兩個對象調用hashCode方法必須返回不同的整數。但是程序員應該意識到對不同的對象產生不同的hash值可以提供哈希表的性能。

      我們知道創建一個對象 如果不重寫equals和 hashCode方法 ,默認集成超類Object 中的兩方法, Object類中,hashCode方法是通過Object對象的地址計算出來的,因為Object對象只與自身相等,所以同一個對象的地址總是相等的,計算取得的哈希碼也必然相等,對於不同的對象,由於地址不同,所獲取的哈希碼自然也不會相等。因此到這里我們就明白了,如果一個類重寫了equals方法,但沒有重寫hashCode方法,將會直接違法了第2條規定,這樣的話,如果我們通過映射表(Map接口)操作相關對象時,就無法達到我們預期想要的效果。


免責聲明!

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



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