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