HashMap を直接初期化するにはどうすればよいでしょうか (文字通り)? 質問する

HashMap を直接初期化するにはどうすればよいでしょうか (文字通り)? 質問する

Java HashMap を次のように初期化する方法はありますか?

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};

正しい構文は何でしょうか? これに関しては何も見つかりませんでした。これは可能ですか? マップを作成するときに事前にわかっていて、変更されない「最終/静的」値をマップ内に配置する最短/最速の方法を探しています。

ベストアンサー1

すべてのバージョン

1 つのエントリだけが必要な場合: がありますCollections.singletonMap("key", "value")

Java バージョン 9 以上の場合:

はい、今は可能です。Java 9 では、マップの作成を簡素化するファクトリー メソッドがいくつか追加されました。

// this works for up to 10 elements:
Map<String, String> test1 = Map.of(
    "a", "b",
    "c", "d"
);

// this works for any number of elements:
import static java.util.Map.entry;    
Map<String, String> test2 = Map.ofEntries(
    entry("a", "b"),
    entry("c", "d")
);

上記の例では、testと は両方ともtest2同じですが、マップの表現方法が異なるだけです。 メソッドはMap.ofマップ内の最大 10 個の要素に対して定義されますが、Map.ofEntriesメソッドにはそのような制限はありません。

この場合、結果のマップは不変マップになることに注意してください。マップを変更可能にしたい場合は、 などを使用して再度コピーすることができますmutableMap = new HashMap<>(Map.of("a", "b"));。また、この場合、キーと値は であってはならないことにも注意してくださいnull

(参照JEP 269そしてそのJavadoc

Java バージョン 8 までの場合:

いいえ、すべての要素を手動で追加する必要があります。匿名サブクラスで初期化子を使用すると、構文を少し短くすることができます。

Map<String, String> myMap = new HashMap<String, String>() {{
    put("a", "b");
    put("c", "d");
}};

ただし、匿名サブクラスによって、望ましくない動作が発生する場合があります。たとえば、次のような動作が発生します。

  • メモリ消費量、ディスク容量消費量、起動時間を増加させる追加クラスを生成します。
  • 非静的メソッドの場合: 作成メソッドが呼び出されたオブジェクトへの参照を保持します。つまり、作成されたマップオブジェクトが参照されている間は、外部クラスのオブジェクトをガベージコレクションすることができず、追加のメモリがブロックされます。

初期化に関数を使用すると、初期化子でマップを生成することもできますが、厄介な副作用を回避できます。

Map<String, String> myMap = createMap();

private static Map<String, String> createMap() {
    Map<String,String> myMap = new HashMap<String,String>();
    myMap.put("a", "b");
    myMap.put("c", "d");
    return myMap;
}

おすすめ記事