如果你重載了equals,比如說是基於對象的內容實現的,而保留hashCode的實現不變,那么很可能某兩個對象明明是“相等”,而hashCode卻不一樣。
這樣,當你用其中的一個作為鍵保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一個作為鍵值去查找他們的時候,則根本找不到。
使用HashMap,如果key是自定義的類,就必須重寫hashcode()和equals()。
而對於每一個對象,通過其hashCode()方法可為其生成一個整形值(散列碼),該整型值被處理后,將會作為數組下標,存放該對象所對應的Entry(存放該對象及其對應值)。 equals()方法則是在HashMap中插入值或查詢時會使用到。當HashMap中插入值或查詢值對應的散列碼與數組中的散列碼相等時,則會通過equals方法比較key值是否相等,所以想以自建對象作為HashMap的key,必須重寫該對象繼承object的hashCode和equals方法。 2.本來不就有hashcode()和equals()了么?干嘛要重寫,直接用原來的不行么? HashMap中,如果要比較key是否相等,要同時使用這兩個函數!因為自定義的類的hashcode()方法繼承於Object類,其hashcode碼為默認的內存地址,這樣即便有相同含義的兩個對象,比較也是不相等的,例如,生成了兩個“羊”對象,正常理解這兩個對象應該是相等的,但如果你不重寫 hashcode()方法的話,比較是不相等的!
HashMap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認為他們是相等的。若equals()不相等則認為他們不相等。如果只重寫hashcode()不重寫equals()方法,當比較equals()時只是看他們是否為同一對象(即進行內存地址的比較),所以必定要兩個方法一起重寫。HashMap用來判斷key是否相等的方法,其實是調用了HashSet判斷加入元素是否相等。
