(元)店長のITブログ

いまはJavaプログラマやってます。

【Java】Listから配列への変換

こんにちは。

現在は、製造業向けの業務アプリをJavaで開発してます。
仕様がなかなか決まらないのでふわふわしてます。
色々独自APIがあって辛いです。

さて今回はListから配列への変換です。
例によって備忘録ということで。

背景

独自モデルクラスがあってCollectionを継承していたのだが
使いたいAPIの引数が配列だった。
ちなみにバージョンはJava6です。

Listから配列へ変換

java.util.Collection.toArrayメソッドを使う。

早速実装。

import java.util.ArrayList;
import java.util.List;

public class ListToArray {

    /**
    * Listから配列の変換
    *
    * @param args
    */
    public static void main(String[] args) {
        // リストの作成
        List<String> list = new ArrayList<>();
        list.add("hoge");
        list.add("huga");
        list.add("moge");

        // 配列に変換
        String[] array = (String[]) list.toArray();

        // 確認
        for (String str : array) {
            System.out.println(str);
        }
    }
}

あら…

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at hello.ListToArray.main(ListToArray.java:21)

ClassCastException発生…
toArrayには変換先の配列の一つ目のデータを設定しないとだめなんですね。
前に調べた時も同じエラーを出した気がします。

再実装。

// 配列に変換
        String[] array = list.toArray(new String[0]);

        …

出力結果

hoge
huga
moge

今度は正常にできました。

ところでなんで「String[0]」なんだろうと思ったら 調べてくれている方がいました。

list.toArray(new String[list.size()])なの?list.toArray(new String[0])なの?

new String[0]だと無駄にオブジェクトを作成してしまうみたいですね。

再々実装。

// 配列に変換
        String[] array = list.toArray(new String[list.size()]);
        
        …

出力結果

hoge
huga
moge

勉強になりました。
今度からnew String[list.size()]で実装するようにします。