
はじめに
Javaプログラミングでは、データの対応関係(キーと値)を扱う場面が多く、その際に頻繁に登場するのがMapです。本記事では、Javaでデータ型としてのMapを初期化する基本的な方法を紹介します。
Mapとは?
MapはJavaのコレクションフレームワークの一部で、「キー(K)と値(V)のペアを保持するコレクション」です。代表的な実装クラスとして、HashMapがあります。
基本的な初期化方法
new HashMap<>():
素直にHashMapクラスをインスタンス化する方法です。インスタンス化したMapオブジェクトに対して、要素を追加して集合を作る方法で、変更を前提としたMapオブジェクトを作成する場合、最も使われる方法です。
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 100);
map.put("banana", 200);
map.put("cherry", 300);
System.out.println(map);
}
}
new HashMap(){}
匿名クラス+インスタンス初期化ブロック(ダブルブレースイニシャライザ)を使う方法があります。
これは Java 8 以前で「宣言と同時に初期化したい」 ときに使われていた手法ですが、
メモリリークやシリアライズ時の警告を引き起こす可能性があるため非推奨 です。
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>() {
{
put("apple", 100);
put("banana", 200);
put("cherry", 300);
}
};
System.out.println(map);
}
}
Map.of()/Map.ofEntries()
Mapインターフェースのof/ofEntriesメソッドを利用し、Mapオブジェクトを作成する方法です。こちらも1行ですっきりかける点が嬉しいポイントで、作成したMapは要素の追加や削除ができません。最も簡潔で使われている方法だと思います。
public class Main {
public static void main(String[] args) {
// Map.of
Map<String, Integer> map = Map.of(
"apple", 100,
"banana", 200,
"cherry", 300
);
// Map.ofEntries()
Map<String, Integer> map = Map.ofEntries(
entry("apple", 100),
entry("banana", 200),
entry("cherry", 300)
);
}
}
Map.of()とMap.ofEntries()は何が違うのか?
相違点一覧
| 特性 | Map.of() | Map.ofEntries() |
|---|---|---|
| 設定できるエントリ数制限 | 10個まで | 制限なし |
| 変更 | 不可 | 不可 |
| 可読性 | 良くはない | 良い |
どちらも不変Mapとなり大きな相違点はありませんが、エントリ数制限と可読性観点で現状Map.ofEntries()の利用が最も理にかなっていると思います。
※不変Mapとは
不変Mapとは、作成後に要素の変更(追加・削除・更新)が一切できないMapのことです。プログラムの安全性が向上し、意図しない変更を防ぐことができます。
※Map.of()はなぜ可読性が良くはないのか
Map.of()は、コンストラクタの引数に、(キー, 値, キー2, 値2…)という順序で指定する必要があり、インデントを工夫すれば困らないかもしれませんが、エントリ(キーと値のセット)を見失うことがあります(以下例)。このことから、エントリをentry()で区切るMap.ofEntries()が可読性観点では優位であると思います。
public class Main {
public static void main(String[] args) {
Map<String, String> map = Map.of("apple", "red", "banana", "yellow", "cherry", "red");
}
}
まとめ
本記事では、JavaでMapを初期化する基本的な方法を紹介しました。Mapを初期化するという観点では、要素を動的に変更する場合はnew HashMap<>()、固定データを安全に扱いたい場合はMap.ofEntries()を選ぶのがベストだと考えます。ユースケースに応じて、選択してください!
