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()可能相等,也可能不等 spa
原本不就有hashcode()和equals()了麼?幹嗎要重寫,直接用原來的不行麼?code
HashMap中,若是要比較key是否相等,要同時使用這兩個函數!由於自定義的類的hashcode()方法繼承於Object類,其hashcode碼爲默認的內存地址,這樣即使有相同含義的兩個對象,比較也是不相等的。對象