面試準(zhǔn)備1:hashcode相等的兩個(gè)對(duì)象一定==相等么?equals相等么?反過來【兩個(gè)對(duì)象用equals比較相等,那它們的hashcode】相等么?

結(jié)論:兩個(gè)對(duì)象equals相等,則它們的hashcode必須相等,反之則不一定。

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

public native int hashCode();

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

由此可知默認(rèn)情況下

兩個(gè)對(duì)象==相等,則其hashcode一定相等,反之不一定成立。

兩個(gè)對(duì)象equals相等,則其hashcode一定相等,反之不一定成立?!竞蜕弦粭l等價(jià),因?yàn)镺bject的equals實(shí)現(xiàn)用的就是 對(duì)象的==相等來判斷】

如果equals方法和hashCode方法被重寫,則需滿足hashCode 的常規(guī)協(xié)定

1.在 Java 應(yīng)用程序執(zhí)行期間,在對(duì)同一對(duì)象多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是將對(duì)象進(jìn)行 equals 比較時(shí)所用的信息沒有被修改。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無需保持一致。

2.如果根據(jù) equals(Object) 方法,兩個(gè)對(duì)象是相等的,那么對(duì)這兩個(gè)對(duì)象中的每個(gè)對(duì)象調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。

3.如果根據(jù) equals(java.lang.Object) 方法,兩個(gè)對(duì)象不相等,那么對(duì)這兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用 hashCode 方法不要求一定生成不同的整數(shù)結(jié)果。但是,程序員應(yīng)該意識(shí)到,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能。

所以按規(guī)定重寫的情況下

兩個(gè)對(duì)象equals相等,則它們的hashcode必須相等,反之則不一定。

兩個(gè)對(duì)象==相等,則它們的hashcode必須相等,反之則不一定?!?=相等,則equals必然相等】

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

兩個(gè)對(duì)象equals相等,則它們的hashcode必須相等,反之則不一定。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容