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
。
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;
}