29

ハッシュマップの仕組みについて読んでいました。「2つの異なるオブジェクトが同じハッシュコードを持つとどうなるか」を読んでいました 。

それによると、2 つのオブジェクトが同じハッシュコードを持っている場合、両方が格納されますLinkedListが、2 つのハッシュコードがある場合、前のハッシュコードは新しいもので上書きされることがわかっています (間違っている場合は修正してください)。

ハッシュマップがオブジェクトをキーとして内部的に使用する方法と、2 つのオブジェクトが同じハッシュコードを持つ場合に何が起こるか、および両方のオブジェクトがget().

4

5 に答える 5

40

いいえ、2 番目のhashCode.

それも等しい場合にのみオーバーライドされます( で述べたようにequals)。そうでない場合、両方の値がリンクされたリストに保持されます。

キーを取得すると、同じ値を持つすべてのノードがhashCode提供されたキーと比較され、いずれかが等しくなるまで比較され、その値が (equalsメソッドを使用して) 返されます。

マップ内に等しいキーがない場合は、 が得られますnull

多くのオブジェクトが同じ hashCode (より正確には、 internal のサイズを法とする同じ hashCode ) を持っている場合に発生する唯一の問題はEntry[] table、リンクされたリストが常に読み込まれることです。hashcodeそのため、生成された整数が適切に分散されるようにメソッドを設計することが重要です。

于 2013-01-09T17:26:46.850 に答える
6

ハッシュマップの働きを説明しましょう。

put メソッドの動作:

HashMap はハッシュの原理に基づいて動作します。HashMap からオブジェクトを格納および取得するためのメソッドがput()あります。HashMap に格納get()するメソッドにキーと値の両方を渡すと、キー オブジェクトメソッドを使用してハッシュコードが計算され、そのハッシュコードにハッシュを適用することで、値オブジェクトを格納するバケットの場所が特定されます。取得中は、キー オブジェクトの equals メソッドを使用して正しいキーと値のペアを見つけ、そのキーに関連付けられた値オブジェクトを返します。HashMap は衝突の場合にリンク リストを使用し、オブジェクトはリンク リストの次のノードに格納されます。また、HashMap は、リンクされたリストのすべてのノードにキーと値の両方のタプルを格納しますput()hashcode()

get メソッドの動作:

Key および Value オブジェクトをput()Java HashMap のメソッドに渡すと、HashMap 実装は Key オブジェクトの hashCode メソッドを呼び出し、返されたハッシュコードを独自のハッシュ関数に適用して、Entry オブジェクトを格納するためのバケットの場所を見つけます。言及すべき重要な点は、Java の HashMap が格納することです。バケット内の Map.Entry としてのキーと値の両方のオブジェクト。バケット内に複数の Entry オブジェクトが見つかった場合、同じバケット内の各ノードの ke.equals メソッドが呼び出されます。

于 2013-01-10T11:22:48.173 に答える
4

と を定義するhashCodeequalsためのルールに従っていると仮定する、説明したシナリオでデータが失われることはありません。せいぜい、時間の経過とともにパフォーマンスが低下します。

于 2013-01-09T17:28:21.827 に答える
2

Javaハッシュマップでは、いくつかの方法を使用してそれを行うことができます。暗黒時代の私の古いCS201データ構造クラスから:

1)ハッシュマップの各バケットは、同じハッシュ値を持つ追加されたすべてのエントリを保持するリンクリストの先頭になることができます。追加時の衝突は、リンクリストの最後に新しいエントリを追加することを意味します。検索とは、リンクリストのバケットにハッシュした後、リンクリスト内のすべてのものを線形にチェックする必要があることを意味します。

2)衝突が発生し、ストアが概念的に配列である場合は、空のスポットを見つけてそこに新しいエントリを追加するまで、その時点から繰り返すことができます。検索の場合、これは、ハッシュバケットが占有されていることがわかった場合、そのポイントから、ハッシュマップをサポートする配列内の次の空のスポットまで線形に比較する必要があることを意味します。

どちらの場合も、同じハッシュを持つエントリが複数あると、パフォーマンスが低下します。一般的なケースでは、これは、ハッシュ関数(ハッシュコードの生成に使用)が少数の可能な値を返すことを意味し、マップがいっぱいになるとパフォーマンスが低下します。Java HashMapは、ハッシュマップに入る一般的なデータの一般的なケースにうまく適合するように、そのようなことに関する50年の研究を利用してきました。

@dystroyが、equals()メソッドに従って一致する2つのエントリをマップに含めることはできないというルールについてコメントしたことに注意してください。

于 2013-01-09T17:31:08.667 に答える