HashMap中,比較key是否相等爲什麼要重寫equal() 和hashCode()這兩個方法?

在HashMap中,如果key爲類對象,則必須要重寫hashCode() 和equal()這兩個方法。Why?首先了解下未被重寫的hashCode() 和equal()方法。

1.未被重寫的hashCode() 和equal()方法

public int hashCode():HashCode是根類Obeject中的方法。默認情況下,Object中的hashCode() 返回對象的32位jvm內存地址。也就是說如果對象不重寫該方法,則返回相應對象的32爲JVM內存地址。 

public bollean equals():用於比較兩個對象是否相同,它其實就是使用兩個對象的內存地址在比較。Object類中的equals方法內部使用的就是==比較運算符。

2.在HashMap中,判斷兩個對象(key)是否相等的規則:

2.1.判斷兩個對象的hashCode()是否相等

如果不相等,認爲兩個對象也不相等,完畢

如果相等,轉入2

2.2.判斷兩個對象的equals()是否相等

如果不相等,認爲兩個對象也不相等

如果相等,認爲兩個對象相等

3.爲什麼要重載equal方法?


        因爲Object的equal方法默認是兩個對象的引用的比較,意思就是指向同一內存,地址則相等,否則不相等;如果你現在需要利用對象裏面的值來判斷是否相等,則重載equal方法。

4.爲什麼重載hashCode方法?


        一般的地方不需要重載hashCode(),只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時纔會重載hashCode(),那麼爲什麼要重載hashCode()呢?

如果不重載hashCode()方法,由於兩個對象實例的內存地址不同,根據2.1,則判爲不等。

重載之後,hashCode()方法變成判斷其邏輯上是否相同,根據2.1,則判爲相等。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章