結論:兩個對象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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。