RandomAccess接口是List 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。
在对List特别的遍历算法中,要尽量来判断是属于RandomAccess(如ArrayList)还是SequenceAccess(如LinkedList),因为适合RandomAccess List的遍历算法,用在SequenceAccess List上就差别很大,即对于实现了RandomAccess接口的类实例而言,此循环
     for (int i=0, i<list.size(); i++)
list.get(i);
的运行速度要快于以下循环:
     for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
通过下面的代码,大家可以加深理解。

 /**//*
/**//*
 *@author 我为J狂 建立日期 2007-4-22
*@author 我为J狂 建立日期 2007-4-22
 *
*
 */
*/
 package com.bokee.lzqdiy;
package com.bokee.lzqdiy;

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

 public class Travel
public class Travel

 {
{


 /** *//**
    /** *//**
 * @param args
     * @param args
 */
     */
 public static void travel(List list)
    public static void travel(List list)

 
     {
{
 if (list instanceof RandomAccess)
        if (list instanceof RandomAccess)

 
         {
{
 System.out.println("实现了RandomAccess接口,不使用迭代器!");
            System.out.println("实现了RandomAccess接口,不使用迭代器!");
 for(int i=0;i<list.size();i++)
            for(int i=0;i<list.size();i++)

 
             {
{
 System.out.println(list.get(i));
                System.out.println(list.get(i));
 }
            }
 }
        }
 else
        else

 
         {
{
 System.out.println("没实现RandomAccess接口,使用迭代器!");
            System.out.println("没实现RandomAccess接口,使用迭代器!");
 for (Iterator iter = list.iterator(); iter.hasNext();)
            for (Iterator iter = list.iterator(); iter.hasNext();)

 
             {
{
 System.out.println((String) iter.next());
                System.out.println((String) iter.next());
 }
            }
 }
        }
 }
    }
 public static void main(String[] args)
    public static void main(String[] args)

 
     {
{
 List list=new ArrayList();
        List list=new ArrayList();
 list.add("a");
        list.add("a");
 list.add("b");
        list.add("b");
 travel(list);
        travel(list);
 list=new LinkedList();
        list=new LinkedList(); 
 list.add("c");
        list.add("c");
 list.add("d");
        list.add("d");
 travel(list);
        travel(list);
 }
    }
 }
}

下面的程序用来测试ArrayList和LinkedList遍历方式的不同对性能(执行时间)的影响。
package net.blogjava.lzqdiy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.RandomAccess;
public class TestDifferent
{
    public static void main(String[] args)
    {
        if (args.length == 0)
        {
            System.err.println("请输入元素的个数和遍历次数!");
            return;
        }
        int number = Integer.parseInt(args[0]);// 集合中元素的个数
        int count = Integer.parseInt(args[1]);// 遍历集合中元素的次数
        List list = new ArrayList();
        addObject(list, number);//向集合中添加number个元素
        System.out.println("遍历ArrayList:");
        travelwithoutIterator(list, count);//不用迭代器遍历
        travelwithIterator(list, count);//用迭代器遍历
        list = new LinkedList();
        addObject(list, number);//向集合中添加number个元素
        System.out.println("遍历LinkedList:");
        travelwithoutIterator(list, count);//不用迭代器遍历
        travelwithIterator(list, count);//用迭代器遍历
    }
    /** */
    /**
     * *
     * 
     * @param args
     */
    public static void addObject(List list, int n)
    {
        for (int m = 1; m <= n; m++)
        {
            list.add("" + m);
        }
    }
    public static void travelwithoutIterator(List list, int count)
    {
        long startTime;
        long endTime;
        startTime = System.currentTimeMillis();
        for (int a = 1; a <= count; a++)
        {
            for (int i = 0; i < list.size(); i++)
            {
                list.get(i);
            }
        }
        endTime = System.currentTimeMillis();
        long interval = endTime - startTime;
        System.out.println("不使用迭代器的间隔时间:" + interval);
    }
    public static void travelwithIterator(List list, int count)
    {
        long startTime;
        long endTime;
        startTime = System.currentTimeMillis();
        for (int a = 1; a <= count; a++)
        {
            for (Iterator iter = list.iterator(); iter.hasNext();)
            {
                iter.next();
            }
        }
        endTime = System.currentTimeMillis();
        long interval = endTime - startTime;
        System.out.println("使用迭代器的间隔时间:" + interval);
    }
    public static void travel(List list, int count)
    {
        long startTime;
        long endTime;
        if (list instanceof RandomAccess)
        {
            System.out.println("实现了RandomAccess接口,不使用迭代器!");
            startTime = System.currentTimeMillis();
            for (int a = 1; a <= count; a++)
            {
                for (int i = 0; i < list.size(); i++)
                {
                    list.get(i);
                }
            }
            endTime = System.currentTimeMillis();
            long interval = endTime - startTime;
            System.out.println("间隔时间:" + interval);
        } else
        {
            System.out.println("没实现RandomAccess接口,使用迭代器!");
            startTime = System.currentTimeMillis();
            for (int a = 1; a <= count; a++)
            {
                for (Iterator iter = list.iterator(); iter.hasNext();)
                {
                    iter.next();
                }
            }
            endTime = System.currentTimeMillis();
            long interval = endTime - startTime;
            System.out.println("间隔时间:" + interval);
        }
    }
}
我在命令行输入:java TestDifferent 100 10000
输出结果是:
遍历ArrayList:
不使用迭代器的间隔时间:31
使用迭代器的间隔时间:63
遍历LinkedList:
不使用迭代器的间隔时间:93
使用迭代器的间隔时间:32
以上结果随着JVM的运行环境而变化。
当元素个数>100并且遍历次数大于10000次时效果明显。