hashcode相等的兩個對象一定==相等么?equals相等么?反過來【兩個對象用equals比較相等,那它們的hashcode】相等么?


結論:兩個對象equals相等,則它們的hashcode必須相等,反之則不一定。

hashCode是繼承自Object的方法,首先看hashCode方法的定義:

public native int hashCode(); 

可見hashCode方法是一個native方法【"A native method is a Java method whose implementation is provided by non-java code."】,因為native方法是由非Java語言實現的,所以這個方法的定義中也沒有具體的實現。根據jdk文檔,該方法的實現一般是“通過將該對象的內部地址轉換成一個整數來實現的”,這個返回值就作為該對象的哈希碼值返回。

由此可知默認情況下

兩個對象==相等,則其hashcode一定相等,反之不一定成立。

兩個對象equals相等,則其hashcode一定相等,反之不一定成立。【和上一條等價,因為Object的equals實現用的就是 對象的==相等來判斷】

如果equals方法和hashCode方法被重寫,則需滿足hashCode 的常規協定

1.在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。

2.如果根據 equals(Object) 方法,兩個對象是相等的,那么對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。

3.如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那么對這兩個對象中的任一對象上調用 hashCode 方法不要求一定生成不同的整數結果。但是,程序員應該意識到,為不相等的對象生成不同整數結果可以提高哈希表的性能

所以按規定重寫的情況下

兩個對象equals相等,則它們的hashcode必須相等,反之則不一定。

兩個對象==相等,則它們的hashcode必須相等,反之則不一定。【==相等,則equals必然相等】

所以總的來說,只要按照規定,則有:

兩個對象equals相等,則它們的hashcode必須相等,反之則不一定



作者:shaYanL
鏈接:https://www.jianshu.com/p/17a02ad2f62b
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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