リストなどのコレクションと配列の変換

Javaで、たまにリストと配列を変換したり、コピーしたりするときがあります。 でも意外とやろうとするたびに忘れてしまうので、ざっとまとめてみました。

●リスト から 配列(変換)

  • リストの要素は確定できない場合: Object [] arr = list.toArray();
  • パラメータのあるの場合、パラメータ T []arg0 は配列の形になっていますが、以下利用する: SomeType [] arr = list.toArray(new SomeType [0]); (SomeTypeは配列の形。例えば:String)

例えば:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
String[] s=list.toArray(new String[0]);
//String[] s=list.toArray(new String[list.size()]);
for (String ss : s) {
    System.out.println(ss);
}

結果: a b c d

説明:toArray の引数は、new String [0]でもかまいませんが、 あらかじめサイズが確定している場合は、そのサイズで配列を作っておいた方がわずかながら効率が良くなります。

●リスト から リスト(変換)

  • addAll(Collection<? extends E> collection)メソードを利用する。

例えば:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
List<String> list1 = new ArrayList<String>();
list1.add("a");
list1.add("b");
list1.add("c");
list1.add("d");
List<String> list2 = new ArrayList<String>();
list2.addAll(list1);
for (String s : list2) {
  System.out.println(s);
}

結果: a b c d

●配列 から リスト(変換)

  • Arrays.asList(T... array)メソードを利用する。

例えば:

1
2
3
4
5
String[] s = { "a", "b", "c", "d" };
 List<String> list = Arrays.asList(s);
for (String ss : list) {
    System.out.println(ss);
}

結果: a b c d

注意:Arrays.asList(T...) だけでもリストに変換できますが、以下の制限がかかります。

  • 配列と連動する(配列を変更したらリストに反映される、リストを変更したら配列に反映される)

例えば:

1
2
3
4
5
6
7
8
String[] s = new String[5];
List<String> list = Arrays.asList(s);
for (int i = 0; i < 5; i++) {
    s[i] = String.valueOf(i);
}
for (String s1 : list) {
    System.out.println(s1);
}

結果: 0 1 2 3 4

  • 追加(add, addAll)、削除(remove, clear) ができない(UnsupportedOperationException がスローされる) そのため、ArrayListにコピーしておくのが無難です。 例えば:
1
2
3
4
String[] s = { "a", "b", "c", "d" };
List<String> list = Arrays.asList(s);
list.add("e");
list.remove("a");

結果:

以下、修正したコードは 追加(add, addAll)、削除(remove, clear) ができる:

1
2
3
4
5
6
7
8
String[] s = { "a", "b", "c", "d" };
List<String> list = new ArrayList<String>();
list.addAll(Arrays.asList(s));
list.add("e");
list.remove("a");
for (String s1 : list) {
    System.out.println(s1);
}

結果: b c d e

●配列 から 配列(コピー)

大きさの違う配列にコピーしたい場合=>Arrays.copyOf()メソッド(Java6以上)やSystem.arraycopy()メソッドを使う (詳細はJavaコーディング規約「3.3.7 単純な配列をコビーするときはclone()など既存のメソッドを利用する」を参照)。