第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インターフェースを目印にして、ループ処理を使い分けるようにしましょう。

