以下のキー/値リストでは、「val3」がさまざまなキーに対して繰り返されています。このようなタイプのリストに最適なマップはどれですか。
「val3」は、複数のキーが指すように1回だけ保存する必要があります。
key1 ---- > val1
key2 ----> val3
key3 ----> val3
key5 ----> val5
key6 ----> val3
key7 ----> val6
key8 ----> val3
key9 ----> val3
以下のキー/値リストでは、「val3」がさまざまなキーに対して繰り返されています。このようなタイプのリストに最適なマップはどれですか。
「val3」は、複数のキーが指すように1回だけ保存する必要があります。
key1 ---- > val1
key2 ----> val3
key3 ----> val3
key5 ----> val5
key6 ----> val3
key7 ----> val6
key8 ----> val3
key9 ----> val3
どんなMap
実装でもかまいません。すべてのJavaコレクションは参照のみを保持し、実際のオブジェクトは保持しないため、同じオブジェクトをマップに複数回配置すると、すべての値が同じオブジェクトを指します。val3
つまり、ルックアップを通じて行われた変更は、をkey2
指す他のキーでルックアップするときに反映されますval3
。
簡略化した例を考えてみましょう。
VeryLarge v = new VeryLarge();
Map<Integer, VeryLarge> map = new HashMap<>();
map.put(1, v);
map.put(2, v);
map.put(3, v);
単一VeryLarge
のインスタンスは、すべての1
、2
および3
キーによって参照されます。
clone
操作によって値を取得しないこと、または値が不変オブジェクトでないことを確認する限り(String
リテラルまたはInteger.valueOf()
(-128から127までの値はキャッシュされ、キャッシュから返される)例外です)、終了します。同じ関係する参照を指す複数のキーを使用します。
HashMap
たとえば、@ Tomasz Nurkiewiczがアドバイスしたように、使用できます。