株式会社イーヴ

EeBlog(テクニカルブログ)

TOP > EeBlog > 第40 回 Listの操作にかかる時間

第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のほうが適していますし、計測結果も違ってきます。