Java中的 ==,equals方法,hashCode方法的區別

如果要比較實際內存中的內容,那就要用equals方法,但是! 如果是你自己定義的一個類,比較自定義類用equals和==是一樣的,都是比較句柄地址,因爲自定義的類是繼承於object,而object中的equals就是用==來實現的,你可以看源碼。
那爲什麼我們用的String等等類型equals是比較實際內容呢,是因爲String等常用類已經重寫了object中的equals方法,讓equals來比較實際內容。
在一般的應用中你不需要了解hashcode的用法,但當你用到hashmap,hashset等集合類時要注意下hashcode。 你想通過一個object的key來拿hashmap的value,hashmap的工作方法是,通過你傳入的object的hashcode他會在內存中找地址,當找到這個地址後再通過equals方法來比較這個地址中的內容是否和你原來放進去的一樣,一樣就取出value。 所以這裏要匹配2部分即hashcode和equals方法都要進行比較,(因爲兩個對象可能不同但是他們的hashcode肯恩是相同的,由於hashcode方法可以重載的原因。)
但假如說你new一個object作爲key去拿value是永遠得不到結果的,因爲每次new一個object,這個object的hashcode是永遠不同的,所以我們要重寫hashcode,你可以令你的hashcode是object中的一個恆量,這樣永遠可以通過你的object的hashcode來找到key的地址,然後你要重寫你的equals方法,使內存中的內容也相等

綜上:
==默認比較對象在JVM中堆中的地址。
hashCode 默認返回對象在JVM中的存儲地址(對象內容均轉化爲int型輸出)。
equal比較對象,默認也是比較對象在JVM中的地址,同==

發佈了22 篇原創文章 · 獲贊 37 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章