Javaでリストと配列を変換、コピーする方法(まとめ)

Javaで、たまにリストと配列を変換したり、コピーしたりするときがあります。
でも意外とやろうとするたびに忘れてしまうので、ざっとまとめてみました。
(解説を分かりやすくするために、ジェネリクスを使用していません)

リスト から 配列(変換)

public static String[] convert(List<String> list){
	return list.toArray(new String[list.size()]);
}

toArray の引数は、new String[0]でもかまいませんが、
あらかじめサイズが確定している場合は、そのサイズで配列を作っておいた方がわずかながら効率が良くなります。
Listから配列への無駄のない変換 - 地平線に行く

リスト から リスト(コピー)

public static List<String> copy(List<String> list){
	return new ArrayList<String>(list);
}

Java Collections Framework のクラス*1には、必ずCollection 型の引数を持つコンストラクタが実装されているので、それを使えば簡単にコピーできます。

配列 から リスト(変換)

public static List<String> convert(String[] array){
	return new ArrayList<String>(Arrays.asList(array));
}

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

  • 配列と連動する(配列を変更したらリストに反映される、リストを変更したら配列に反映される)
  • 追加(add, addAll)、削除(remove, clear) ができない(UnsupportedOperationException がスローされる)

そのため、ArrayListにコピーしておくのが無難です。


逆に、連動してもかまわないのであれば、以下のやり方で一発変換することも可能です。

List<String> list = Arrays.asList("ABC", "DEF", "GHI");

配列 から 配列(コピー)

public static String[] copy(String[] array){
	return Arrays.copyOf(array, array.length);
}

Arrays.copyOfSystem.arraycopy のラッパーです。
新しい配列を作ってコピーするのであれば、Arrays.copyOf の方が簡単です。

ジェネリクス

参考までに、今回の汎用クラスを作ってみました。
ジェネリクスに対応し、引数をCollectionにしています)

public class ArrayListUtils {
	/**
	 * @see Collection#toArray(Object[])
	 */
	public static <T> T[] convert(Collection<T> c, T[] array){
		return c.toArray(array);
	}

	/**
	 * @see ArrayList(Collection)
	 * @see Arrays#asList(Object...)
	 */
	public static <T> List<T> convert(T[] array){
		return new ArrayList<T>(Arrays.asList(array));
	}
	
	/**
	 * @see Collection
	 */
	public static <T> List<T> copy(Collection<T> c){
		return new ArrayList<T>(c);
	}
	
	/**
	 * @see Arrays#copyOf(Object[], int)
	 */
	public static <T> T[] copy(T[] array){
		return Arrays.copyOf(array, array.length);
	}
}

コレクションから配列への変換メソッドがちょっといまいち・・・。

*1:List や Set、Mapなど