ぺんぎんらぼ

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です。たまに絵を描きます。

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です

Java Tips - Mapの初期化

java.util.Mapオブジェクトの初期化方法いろいろです。

putメソッドを使って初期化

基本ですね。初期化するエントリごとにMapインターフェースのputメソッドを使用して初期化します。

Map<String, String> fruits = new HashMap<>();
fruits.put("apple", "リンゴ");
fruits.put("orange", "みかん");
fruits.put("grape", "ぶどう");

インスタンスイニシャライザを使って初期化

あまり知られていませんが、インスタンスイニシャライザというものを使うことで初期化コードを書くことができます。
インスタンスイニシャライザ内でputメソッドを使用して初期化します。 いくつか注意点があります。

  • putメソッドを使うときに、「obj.put("apple", "リンゴ");」と書かず、単に「put("apple", "リンゴ");」とオブジェクトを指定せずに記述します。
  • HashMapは、Serializableインターフェースを実装しているので、シリアルバージョンIDを定義しないと、IDE上で警告が表示されます。
Map<String, String> fruits = new HashMap<>() {
    private static final long serialVersionUID = 1L;
    {
        put("apple", "リンゴ");
        put("orange", "みかん");
        put("grape", "ぶどう");
    }
};

利点が少ないので、この記法をとることは少ないでしょう。 利点は少ないのですが、この後に紹介するMap.ofやMap.ofEntriesはJava9以降でないと使用できないので、Java8以前の標準機能でワンライナーで初期化するのであれば、この方法になります。

Map.ofを使って初期化

Java9で追加されたMapインターフェースのofメソッドを使用して初期化します。

Map<String, String> fruits = Map.of("apple", "リンゴ", "orange", "みかん", "grape", "ぶどう");

この初期化方法は変更不可能なMapが生成されるので、変更する場合は、実装クラスのインスタンスを生成して、引数にMap.ofメソッドで生成したMapオブジェクトを指定します。

また、Map.ofメソッドの引数は、Mapのキーと値を交互に指定します。引数が多くなると、どこがキーでどこが値なのかわかりにくくなりますし、キーと値が交互に現れる形式の引数なので、可変長引数が使えず、指定できるMapのエントリ数は最大10個となっています。

Map.ofEntriesを使って初期化

Java9で追加されたMapインターフェースのofEntriesメソッドを使用して初期化します。
Map.ofメソッドでは、指定できるエントリ数が最大10個までという制限がありましたが、Map.ofEntriesメソッドは指定できるエントリ数の制限はありません。

Map<String, String> fruits = Map.ofEntries(
        new AbstractMap.SimpleEntry<String, String>("apple", "リンゴ"),
        new AbstractMap.SimpleEntry<String, String>("orange", "みかん"),
        new AbstractMap.SimpleEntry<String, String>("grape", "ぶどう"));