既存の配列からListのオブジェクトを作る際には以下の2つの方法がある。
-
Arrays.asList(配列)
を使う -
ArrayList
などのList実装クラスのコンストラクタを使う
Arrays.asList(配列)
を使う場合は、シャローコピーとなり参照を渡すだけ。
ArrayList
などのList実装クラスのコンストラクタを使う場合は、新規複製となる。
Arrays.asList(配列)
シャローコピーとなり参照を渡すだけ。
// Arrays.asList()は参照を渡すだけ
String[] ary = {"a", "b", "c"};
List<String> list = Arrays.asList(ary);
// list.add("d"); // => java.lang.UnsupportedOperationException
list.set(0, "e");
System.out.println(Arrays.toString(ary)); //=> [e, b, c] オリジナルの配列も変更されている。
System.out.println(list); //=> [e, b, c]
setでの要素の変更は可能だが、addなど既存の配列の構造を変更する場合はエラーになるので注意。
List実装クラスのコンストラクタ
新規複製となる。
// ArrayListなどのListの実装クラスでインスタンス化すれば新規作成
String[] ary2 = {"a", "b", "c"};
List<String> list2 = new ArrayList<>(Arrays.asList(ary2));
list2.add("d");
list2.set(0, "e");
System.out.println(Arrays.toString(ary2)); //=> [a, b, c] オリジナルの配列は変更されない。
System.out.println(list2); //=> [e, b, c, d]
new ArrayList<>(配列)はできないので、一度Listオブジェクトに変換する必要がある。