コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

ArrayListとLinkedListの比較

「LinkedListが有効な場合があまりないんだが、どんな場合がいいんだ。まともにベンチをとるとほとんどの場合で圧倒的にArrayListが速いんだが。」とつぶやいたところ、FIFOが速いという答えを頂いたので試してみました。

package sample;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

public class ListTest {
    private static final int count = 10000;

    public static void main(String[] args) {
        // ArrayListの測定
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        System.out.println("ArrayList FIFO");
        start();
        for (int i = 0; i < count; i++) {
            arrayList.add(i);
        }
        // 取り出し。
        for (Iterator<Integer> iter = arrayList.iterator(); iter.hasNext();) {
            iter.next();
            iter.remove();
        }
        stop();
        System.out.println("size: " + arrayList.size());
        // LinkedListの測定
        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        System.out.println("LinkedList FIFO");
        start();
        for (int i = 0; i < count; i++) {
            linkedList.add(i);
        }
        // 取り出し
        for (int i = 0; i < count; i++) {
            linkedList.poll();
        }
        stop();
        System.out.println("size: " + linkedList.size());
    }

    private static long begin;

    private static void start() {
        begin = System.currentTimeMillis();
    }

    private static void stop() {
        long end = System.currentTimeMillis();
        System.out.println("間隔: " + (end - begin) + "ms");
    }
}

実行結果は以下です。

ArrayList FIFO
間隔: 72ms
size: 0
LinkedList FIFO
間隔: 4ms
size: 0

まあ、データ構造を考えればArrayListでのFOは相当きついです。こんな検証をしているのは、そもそも会社の人間がみんなLinkedListのみを当たり前のように使用しているわけであって。。。適切に使い分けろというのが難しいなら、もうArrayList以外使うなと言おうかとも思っていたりするので検証してました。