回覆列表
  • 1 # 半夏半心半島靜待

    如果你過載了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判斷加入元素是否相等。

    引用別人說的一段話哈~

    一般來說,如果你要把一個類的物件放入容器中,那麼通常要為其重寫equals()方法,讓他們比較地址值而不是內容值。特別地,如果要把你的類的物件放入雜湊中,那麼還要重寫hashCode()方法;要放到有序容器中,還要重寫compareTo()方法。

    equals()相等的兩個物件,hashcode()一定相等;

    equals()不相等的兩個物件,卻並不能證明他們的hashcode()不相等。換句話說,equals()方法不相等的兩個物件,hashcode()有可能相等。(我的理解是由於雜湊碼在生成的時候產生衝突造成的)。

    反過來:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等

    我的理解哈,

  • 中秋節和大豐收的關聯?
  • 讚美勞動100首詩詞?