2016-09-13 6 views
1

ハッシュコードの衝突を解決するために別個の連鎖を使用するHashMapを考えてみましょう。コリソンチェーンでのハッシュコードの衝突処理

複数のエントリがある場合、hascodeが同じになるところでは、衝突メカニズムはすべてのエントリのリンクリストチェーンを形成します。

さて、そのようなリンクリストがとして存在する場合、考えることができます:ハッシュコードは同じ来ている、とキーが同じ値を持っている

(K1,V1,->) (K2,V2, ->) (K7,V7,->) (K9,V9,) 

今、新しいエントリがで来ているが、 K7。 K7の既存の価値を上書きするか?

+2

ハッシュコードが同じであり、あなたが衝突リスト上で動作している場合は、[はい、それは、以来、意志 '等号()'でキックうによって呼び出されputVal()のスニペットは、すなわちリスト内のキーは、新しいキーと等しいかどうかがチェックされます。したがって、K7と等しいキーに新しい値を追加すると、その値が置き換えられます。 - Btw、hashCode()とequals()を常に実装/オーバーライドする必要がある理由です。 – Thomas

+0

実装によって異なります。 @KevinEscheは言ったように、リストには重複が含まれている可能性があります。なぜあなたはそれを試してみませんか? – Bene

+0

これはドキュメントに明記されています。同じキーを持つ新しいエントリは、古いエントリを上書きします。 –

答えて

5

はい、K7を表す既存のノード内のvalue参照を上書きします。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/HashMap.java#655

+0

ハッシュマップの内部動作を熟考することは間違いなく面白いことですが、この質問は基本的に「ハッシュマップが同じキーを2回使用すると値を上書きしますか?」とマップ契約ごとに「はい」となります。 –

+1

契約を満たす方法はたくさんあり、そのうちの1つだけがハッシュコリジョンチェーン内の既存のノードの「値」参照を置き換えています。実装の詳細を尋ねる際には、この質問がはっきりしています。 –

0

ハッシュ衝突のための解決についてのハッシュマップ機能public V put(K key, V value)explainsの定義。

このマップの指定されたキーに指定された値を関連付けます。 マップに以前にキーのマッピングが含まれていた場合、古い値は に置き換えられました。

put()

633    if (p.hash == hash && 
634     ((k = p.key) == key || (key != null && key.equals(k)))) 
635     e = p; 
... 
652    if (e != null) { // existing mapping for key 
653     V oldValue = e.value; 
654     if (!onlyIfAbsent || oldValue == null) 
655      e.value = value; 
656     afterNodeAccess(e); 
657     return oldValue; 
658    } 
+0

ご回答いただきありがとうございます –

関連する問題