第40 回 Listの操作にかかる時間
今回のテーマは「Listの操作にかかる時間」です。
みなさんはListの要素を繰り返し追加、削除する際に、処理にかかる時間を意識したことがあるでしょうか。 実はListの先頭から操作した場合と末尾から操作した場合では、処理にかかる時間が大幅に違う場合があるのです。
一般に最もよく使われているArrayListを使って時間を計測してみましょう。 時間の計測には、Apache CommonsのStopWatchクラスを使用しています。
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import org.apache.commons.lang.time.StopWatch;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (int i = 100000; i > 0; i--) {
list.add(0, i); }
stopWatch.stop();
System.out.println("要素を先頭に追加した場合:" + stopWatch.getTime()
+ "ミリ秒");
stopWatch.reset();
stopWatch.start();
for (ListIterator<Integer> iterator = list.listIterator();
iterator.hasNext();) {
iterator.next();
iterator.remove();
}
stopWatch.stop();
System.out.println("要素を先頭から削除した場合:" + stopWatch.getTime()
+ "ミリ秒");
stopWatch.reset();
stopWatch.start();
for (int i = 1; i <= 100000; i++) {
list.add(i);
}
stopWatch.stop();
System.out.println("要素を末尾に追加した場合:" + stopWatch.getTime()
+ "ミリ秒");
stopWatch.reset();
stopWatch.start();
for (ListIterator<Integer> iterator = list.listIterator(list.size());
iterator.hasPrevious();) {
iterator.previous();
iterator.remove();
}
stopWatch.stop();
System.out.println("要素を末尾から削除した場合:" + stopWatch.getTime()
+ "ミリ秒");
}
}
処理にかかる時間が全然違うことがわかると思います。
なお、Listに変更が多い処理はLinkedListのほうが適していますし、計測結果も違ってきます。

