JavaでListの要素を初期化・追加する方法

  • 77
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

初めに

JavaでListの要素を初期化・追加を設定したい場合のイディオムを幾つか紹介して、
行き着いたものを紹介します。

環境

java version "1.8.0_25"です。

初期化

asListを使う

検索するとよくでてくる方法がasListを使う方法です。
1行で書けて、要素を並べるだけで良いので可読性も高く便利です。

参考:
http://qiita.com/donsan_24/items/f2be9b6828b73d3fc49e

asListを使う
List<String> list = Arrays.asList("AA", "BB", "CC");

ただし、致命的な問題があり、これで生成したListは、固定サイズのArrayListであるためaddやremoveができません。

asListを使う
List<String> list = Arrays.asList("AA", "BB", "CC");

  // UnsupportedOperationExceptionが発生する
list.add("DD");
list.remove(0); 

標準ライブラリの問題とも言えますが、固定サイズのリストで大丈夫なら便利かも。
ドキュメントにもちゃんと「固定サイズ」と書かれています。
https://docs.oracle.com/javase/jp/7/api/java/util/Arrays.html#asList(T...)

インスタンスイニシャライザを使う方法

インスタンス生成時にメソッドを呼ぶ記述法です。
括弧がわかりにくいですが、原理的には「すべてaddする」方法と同じです。

インスタンスイニシャライザを使う
List<String> list = new ArrayList<String>(){
    {
        add("AA");
        add("BB");
        add("CC");
    }
};

コンストラクタでListを与える。

raccyさんにコメントいただきました。
そういえばListのコンストラクタでListを与えることができるのを失念してました。
なので初期化するのはこの方法が良さそうです。

コンストラクタでListを与える
List<String> list = new ArrayList<>(Arrays.asList("AA", "BB", "CC"));

要素の追加

すべてaddする

要素分addします。
追加する分行を追加するか
拡張for分などでforを回してしまう事が考えられれます。
(個人的には後者が好きです)

すべてadd追加
List<String> list = new ArrayList<>();
list.add("AA");
list.add("BB");
list.add("CC");
forですべてadd追加
List<String> list = new ArrayList<>();
for (String item : new String[]{"AA", "BB", "CC"}) {
    list.add(item);
}

asListとList.addAllを使う

asListで作ったListを対象のListにaddAllしてしまう方法です。
リストを入れなおしているので先ほどの制限を受けないため、こちらもお勧めです。

List<String> list = new ArrayList<>();
list.addAll(Arrays.asList("AA", "BB", "CC"));

list.add("DD");
list.remove(0);

Collections.addAllを使う

(実は最近まで知らなかったのですが、色々してたらIntelliJ IDEAが提案してくれたのですごいと思いました。)

Collections.addAllを使う
List<String> list = new ArrayList<String>();
Collections.addAll(list, new String[]{"AA", "BB", "CC"});

さらにaddAllの第二引数は可変長引数なのでこう書けます。
追加では多分これが一番よさげだと思ってます。

Collections.addAllを使う
List<String> list = new ArrayList<String>();
Collections.addAll(list, "AA", "BB", "CC");

まとめ

Listの初期要素はコンストラクタにasListで指定、
要素の追加はCollections.addAllを検討してましょう。