ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

Listと配列のかなり勘違い

JavaでListとかのコレクションを配列に変換するロジックって、

  1. Collection#toArray()
  2. Collection#toArray(Object[])

の二つがあるんですが、前者は特定の型に変換する必要がない(つまりObjectのまま扱う)場合に使用し、後者は逆に、特定の型に変換する必要がある場合に遣います。

で、よく後者のメソッドを使っていたのですが、引数に渡す配列って、Listのサイズ分の配列を確保する必要ないんですね。かなぁり勘違いしてました(T_T)
引数のObjectは、型情報を与えるだけで、結果を格納する参照は、また別にあるそうです。APIリファレンスにもきっちり書いてありました。一応検証コード書いたので、載せてみます。

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

/**
 * List → 配列に変換するテスト
 * 
 * (実行結果例)
 * aaa
 * 123
 * ---
 * aaa
 * 123
 * ---
 * aaa
 * 123
 */
public class ListToArray
{
	public static void main(String[] args)
	{
		List lst = new ArrayList();
		lst.add("aaa");
		lst.add("123");

		String[] array = null;

		// (誤り)配列をリストのサイズ分用意
		String[] array1 = new String[lst.size()];
		array = (String[])lst.toArray(array1);
		printArray(array);

		// (正しい)配列は型情報の意味として与える
		String[] array2 = new String[0];
		array = (String[])lst.toArray(array2);
		printArray(array);

		// (正しい)上の省略形
		array = (String[])lst.toArray(new String[0]);
		printArray(array);
	}

	private static void printArray(String[] array)
	{
		System.out.println("---");
		for(int i=0; i<array.length; i++)
		{
			System.out.println(array[i]);
		}
	}
}

→勘違いでもなかったっぽいです。
http://d.hatena.ne.jp/taka_2/20050811#p1