株式会社イーブ|未経験・転職の方も就職可能。Javaプログラマー育成のエキスパート

HOMEJAVA技術者育成システム開発求人情報個人情報保護

第 40 回 ~ RandomAccessインターフェース ~

トップページ > Java技術者育成 > Javaワンポイント > 第 40 回 ~ 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インターフェースを目印にして、ループ処理を使い分けるようにしましょう。


[Javaワンポイント]内の前後の記事
第 41 回 ~ 配列のソート ~
→ 第 40 回 ~ RandomAccessインターフェース ~
第 39 回 ~ Listの操作にかかる時間 ~


■更新日時での前後の記事
2月27日 お天気
→ 第 40 回 ~ RandomAccessインターフェース ~
2月26日 お天気