LoginSignup
4
7

More than 3 years have passed since last update.

【Java】 ArrayListを配列に変換する

Last updated at Posted at 2020-04-27

ArrayListを配列に変換する方法と注意点

ListToArray.java
//ArrayList生成
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");

String[] array = (String[])arrayList.toArray();

System.out.println("ArrayList = " + arrayList.toString());
System.out.println("配列 = " + Arrays.toString(array));

結果(NG)

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

なぜか

返すクラスを取得してみる

ListToArray.java
//ArrayList生成
//中略
System.out.println(arrayList.toArray().getClass());

結果

class [Ljava.lang.Object;

Object型配列が返ってきてる。。。

修正

ListToArray.java
//ArrayList生成
//中略
//配列の要素数に0またはarrayList.size()を入れる
String[] array = arrayList.toArray(new String[arrayList.size()]);
//String[] array = arrayList.toArray(new String[0]); ※処理が遅くなる(後述)

System.out.println("ArrayList = " + arrayList.toString());
System.out.println("配列 = " + Arrays.toString(array));

結果(OK)

ArrayList = [A, B, C]
配列 = [A, B, C]

深堀してみる

java.util.ArrayList.class

public <T> T[] toArray(T[] a) {
   if (a.length < size)
     return (T[]) Arrays.copyOf(elementData, size, a.getClass());
     System.arraycopy(elementData, 0, a, 0, size);
     if (a.length > size)
         a[size] = null;
     return a;
}

System.arraycopy(elementData, 0, a, 0, size);
String[]をそのままコピーしていた。
new String[0]でした場合、Arrays.copyOf(3行目)に入り、要素を1つずつコピーするのため処理が遅くなります。  2020/04/29更新

処理時間を検証してみました
 【Java】 ArrayList→配列変換ではサイズを指定するべきなのか

ちなみに

toArrayの引数に指定できるのは変換元のArrayListでしている型のみ
違うクラスをしていするとコンパイルエラーになる。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7