株式会社イーヴ

EeBlog(テクニカルブログ)

TOP > EeBlog > 第41回 RandomAccessインターフェース

第41回 RandomAccessインターフェース

今回のテーマは「RandomAccessインターフェース」です。

ArrayListが実装しているインターフェースの一つにRandomAccessインターフェースがあります。 これはSerializableと同じようにマーカーインタフェースであり、実装したクラスが高速なランダムアクセスをサポートすることを示します。 ランダムアクセスとは必要な部分のみ読み込む方法で、CDの頭出しをイメージするとわかりやすいでしょう。 なお、カセットテープのように先頭から読み込む方法をシーケンシャルアクセスといいます。

では、ランダムアクセスとシーケンシャルアクセスの速度比較を行ってみましょう。

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List;

import org.apache.commons.lang.time.StopWatch;

public class Main { 
    public static void main(String[] args) { 
        List<Integer> list = new ArrayList<Integer>(); 
        for (int i = 0; i < 1000000; i++) { 
            list.add(i); 
        }

        StopWatch stopWatch = new StopWatch(); 
        long randomAccessTime = 0L; 
        long sequentialAccessTime = 0L; 
        for (int i = 0; i < 100; i++) { 
            stopWatch.reset(); 
            stopWatch.start(); 
            for (int j = 0; j < list.size(); j++) { 
                list.get(j);             } 
            stopWatch.stop(); 
            randomAccessTime += stopWatch.getTime();

            stopWatch.reset(); 
            stopWatch.start(); 
            for (Iterator<Integer> iterator = list.iterator(); 
                                               iterator.hasNext();) { 
                iterator.next(); 
            } 
            stopWatch.stop(); 
            sequentialAccessTime += stopWatch.getTime(); 
        } 
        System.out.println("ランダムアクセスにかかった時間:
                                                 " + randomAccessTime + "ミリ秒"); 
        System.out.println("シーケンシャルアクセスにかかった時間:
                                             " + sequentialAccessTime + "ミリ秒"); 
    } 
}

ランダムアクセスのほうが明らかに早いですね。
RandomAccessインターフェースを目印にして、ループ処理を使い分けるようにしましょう。