プログラミング開発

【Java入門】JavaでMapを初期化する方法:初心者に優しい解説

この記事は約5分で読めます。

はじめに

Javaプログラミングでは、データの対応関係(キーと値)を扱う場面が多く、その際に頻繁に登場するのがMapです。本記事では、Javaでデータ型としてのMapを初期化する基本的な方法を紹介します。

Mapとは?

MapはJavaのコレクションフレームワークの一部で、「キー(K)と値(V)のペアを保持するコレクション」です。代表的な実装クラスとして、HashMapがあります。

基本的な初期化方法

  • new HashMap<>(): 柔軟で最も一般的な方法
  • new HashMap(){}: (Java 8 以前で)宣言と同時に複数の要素を入れる方法
  • Map.of()/Map.ofEntries(): 簡潔で不変なMapを作成する方法

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()を選ぶのがベストだと考えます。ユースケースに応じて、選択してください!

  • new HashMap<>()
    柔軟で最も一般的な方法。動的なMap(要素の追加・削除が頻繁にある場合)に最適。変更可能なMapが必要な場合に使用。
  • new HashMap(){}
    (Java 8 以前で)宣言と同時に複数の要素を入れる方法。基本的に使わない方が良い。化石。
  • Map.of()/Map.ofEntries()
    簡潔で不変Mapを作成する方法。要素が固定されている安全なMapが必要な場合に最適で、簡潔に不変Mapを作成する場合に適している。