0

連絡先の名前と連絡先に関連付けられている電話番号のリストを関連付けるためにjava.util.HashMapを使用しているため、タイプはString, List<String>です。ただし、Say key1の場合と同じバケットに正しくマップできるキーが複数存在する可能性があります。<1234,5678>は、ハッシュマップのインデックス2に格納されます。同じインデックスにハッシュできる別のkey2を持つことができます。したがって、key1:<1234,5678>はkey2:<7890,1456>に置き換えられますか???? または、チェーン化され、key1とkey2の両方がそのインデックスに格納されますか?

編集:私はこれを理解しようとしています、以下のコードはニューメキシコのみを返します。この場合、両方とも同じハッシュコードを取得するので、これは衝突が正しいですか?その場合、両方の値を連鎖させるべきではありませんか?したがって、ストレージはハッシュコードが2であると言うように見えるべきではなく、マップ(OR配列)の2のインデックスでは、1-メキシコ、1-新しいメキシコは正しいはずです。したがって、返される値はメキシコとニューメキシコのものである必要がありますか?なぜここで連鎖しないのですか?

public static void main(String[] args)
    {
        Map<Integer,String> map = new HashMap<Integer,String>();
        map.put(1, "Mexico");
        map.put(1, "New Mexico");
        System.out.println(map.get(1));

    }
4

3 に答える 3

3

私はあなたの質問を完全に理解しているとは言えません。

標準のHashMapでは、同じキーで別の値を入力すると、最初の値が置き換えられます。

ただし、たとえばMultiMap(Apache commonsから)を使用して、キーごとに複数の値を格納することができます。

質問が同じインデックスを持つ複数のキーに関連している場合、これは実装によって処理されます。のキーはリンクリストに格納され(バケットごとに1つ)、実際の比較(を使用equals)はgetおよびput操作で実行されます。equalsfalseを返す限り、衝突は発生しません。

コレクション関連の問題と同様に、独自のクラスを使用する場合に行うべき重要なことは、メソッドequalsとメソッドを正しく実装することです(これhashcodeを読んでください)。

編集中のあなたの質問について:

これはHashMapの機能であり、特定のキーを持つ最初の値が新しいキーによって消去されます。したがって、「ニューメキシコ」を追加すると、「メキシコ」はハッシュマップから削除されます。

特定のキーに複数の値を設定する場合は、MultiMapを使用します(または単にを使用しますHashMap<Integer, List<String>>が、put操作は少し面倒です)。

于 2012-09-03T16:28:27.023 に答える
2

これはあなたがもっと注意深く考えるべきデザインです。Mapとプリミティブを使用しているように見えますString-このように使用するとプリミティブになります-独自の設計の実際の抽象データ型によってより適切に提供される抽象化への不十分な近似として。

たとえば、連絡先の名前Stringは私には適切な抽象化のようには感じられません。電話帳には繰り返し名前がいくつありますか?ソリューションが重要なサイズを超えて大きくなると、衝突が発生します。

では、Contactクラスはどこにありますか?適切に記述されたequalsとhashCodeを使用して、名前Stringと関連する電話番号を1つのオブジェクトにカプセル化します。List一意のIDプライベートメンバーを指定します。そのように衝突はありません。そのクラスを使用する人々は、あなたが達成しようとしていることを即座によく理解するでしょう。

于 2012-09-03T16:28:54.270 に答える
0

いいえ、2つの異なるキーが同じ値にハッシュされると、キーはチェーンされ、操作中に、システムは実際のキーに対してequalsを実行して、正しいエントリを見つけます。

hashCode()に対して単純に1を返す縮退クラスを作成した場合でも、HashMapは仕様どおりに機能し、ひどく実行されて単純なリストになります。

于 2012-09-03T16:38:17.970 に答える