以下のキー/値リストでは、「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がアドバイスしたように、使用できます。