##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でしている型のみ
違うクラスをしていするとコンパイルエラーになる。