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", "ぶどう"));