在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,則判爲相等。