配列をリストに追加する以下ふたつの方法のベンチマークをとってみました。
Collections.addAll(...)
-
List#addAll(...)
とArrays.asList(...)
の組み合わせ
ベンチマーク方法
- 10000 の配列を 100 回 List に追加
結果
方法 | 時間(ナノ秒) |
---|---|
Collections | 8974267 |
List + Arrays | 2480949 |
List が ArrayList の場合、Collections よりも List + Arrays の方が高速でした。
実装を見ると、Collections は for ループでひとつずつ追加しているのに対し、List は System.arraycopy で追加しています。速度の差はこのためです。Collections.addAll は Collection 全般に利用できるメソッドで、かつ要素が追加されたかどうかを boolean で返すので、ループで回すのは仕方がないです。
少なくとも、自分でループを回して追加するのはやめましょう。
検証コード
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String... args) {
String[] array = new String[10000];
List<String> list = new ArrayList<>();
long total1 = 0;
for (int i = 0; i < 100; i++) {
long start = System.nanoTime();
Collections.addAll(list, array);
long end = System.nanoTime();
total1 += (end - start);
list.clear();
}
long total2 = 0;
for (int i = 0; i < 100; i++) {
long start = System.nanoTime();
list.addAll(Arrays.asList(array));
long end = System.nanoTime();
total2 += (end - start);
list.clear();
}
System.out.println("total1: " + total1);
System.out.println("total2: " + total2);
}
}
補足
List が LinkedList の場合、Collections の方が若干速くなりました。
方法 | 時間(ナノ秒) |
---|---|
Collections | 19991340 |
List + Arrays | 21064007 |
ただし、こうした用途に LinkedList は向いていないので参考までに。