equals

1.如果是基本變量,沒有hashcode和equals方法,基本變量的比較方式就只有==;

2.如果是變量,由於在java中所有變量定義都是一個指向實際存儲的一個句柄(你可以理解爲c++中的指針),在這裏==是比較句柄的地址(你可以理解爲指針的存儲地址),而不是句柄指向的實際內存中的內容,如果要比較實際內存中的內容,那就要用equals方法,但是!!!

如果是你自己定義的一個類,比較自定義類用equals和==是一樣的,都是比較句柄地址,因爲自定義的類是繼承於object,而object中的equals就是用==來實現的,你可以看源碼。

那爲什麼我們用的String等等類型equals是比較實際內容呢,是因爲String等常用類已經重寫了object中的equals方法,讓equals來比較實際內容,你也可以看源碼。

3. hashcode
在一般的應用中你不需要了解hashcode的用法,但當你用到hashmap,hashset等集合類時要注意下hashcode。

你想通過一個object的key來拿hashmap的value,hashmap的工作方法是,通過你傳入的object的hashcode在內存中找地址,當找到這個地址後再通過equals方法來比較這個地址中的內容是否和你原來放進去的一樣,一樣就取出value。

所以這裏要匹配2部分,hashcode和equals
但假如說你new一個object作爲key去拿value是永遠得不到結果的,因爲每次new一個object,這個object的hashcode是永遠不同的,所以我們要重寫hashcode,你可以令你的hashcode是object中的一個恆量,這樣永遠可以通過你的object的hashcode來找到key的地址,然後你要重寫你的equals方法,使內存中的內容也相等。。。

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