1

Java では、2 つのキーが 1 つの値にマップされている場合、衝突により線形連鎖が発生することを理解しています。

例えば:

    Map myMap= new HashMap();   //Lets says both of them get mapped to same bucket-A and
    myMap.put("John", "Sydney");//linear chaining has occured.
    myMap.put("Mary","Mumbai"); //{key1=John}--->[val1=Sydney]--->[val2=Mumbai]

だから私がするとき:

myMap.get("John");   // or myMap.get("Mary")

バケット A には 2 つの値が含まれているため、JVM は何を返しますか? 「チェーン」への参照を返しますか?「シドニー」を返しますか?それとも「ムンバイ」を返しますか?

4

5 に答える 5

5

線形チェーンは、2 つのキーが 1 つの値にマップされている場合ではなく、キーのハッシュコードが同じ場合に発生します。

だから私がするとき: myMap.get("John"); // または myMap.get("Mary")

map.get("John")あなたにシドニーを与える

map.get("Mary")あなたにムンバイを与える

バケット A には 2 つの値が含まれているため、JVM は何を返しますか?

同じバケットに 2 つの値が含まれている場合、equalsキーのメソッドを使用して、返される正しい値が決定されます。

Key の hashCode がすべて同じ (K,V) ペアを格納するという最悪のシナリオについて言及する価値があります。そのシナリオでは、ハッシュマップはリンクされたリストに劣化します。

于 2013-03-07T16:43:52.060 に答える
3

メソッドのhashCodeは、それがどの「バケット」(別名リスト、別名「線形チェーン」) に配置されるかを決定します。equalsメソッドは、衝突の場合に「バケット」から実際に選択されるオブジェクトを決定します。これが、あらゆる種類のハッシュ マップに格納する予定のすべてのオブジェクトに両方のメソッドを適切に実装することが重要である理由です。

于 2013-03-07T16:43:43.920 に答える
1

あなたのキーは異なります。

最初にいくつかの用語

  • key : の最初のパラメーターput
  • value : の 2 番目のパラメーターput
  • entry :Objectキーと値の両方を保持する an

マップにput入ると、キーHashMapが呼び出さhashCode()れ、エントリが入る必要があるハッシュ バケットが決定されます。このバケットにすでに何かがある場合はLinkedList、バケット内のエントリで形成されます。

マップから取得すると、キーが呼び出さgetれ、エントリを取得するハッシュ バケットが決定されます。バケットに複数のエントリがある場合、マップは、キーが提供したキーを持つエントリが見つかるまで移動します。HashMaphashCode()LinkedListequals()

マップは常に、Objectそのキーに関連付けられた、エントリからの値を返します。hashCode()異なるキーに対して同じ (または類似した) 値を返すと、マップのパフォーマンスが急速に低下します。

Javaジェネリックを使用する必要があるため、コードは実際に読む必要があります

Map<String, String> myMap = new HashMap<String, String>();

Stringこれにより、マップにキーと値を格納するように指示されます。

于 2013-03-07T16:48:05.167 に答える
0

あなたの例を見ると、特定のキーに対して値が連鎖していると思うと混乱します。実際、 Map.Entryオブジェクトは特定のハッシュコードに対してチェーンされています。キーの hashCode によってバックが得られます。次に、チェーンされたエントリを調べて、キーが等しいエントリを見つけます。

于 2013-03-07T16:57:04.227 に答える
0

私の理解では、マップは最初に正しいバケット (キーのハッシュコードで識別) を解決します。同じバケットに複数のキーがある場合、equals メソッドを使用してバケット内の正しい値を見つけます。

于 2013-03-07T16:43:36.183 に答える