关于RandomAccess接口的研究

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
*
*/

package com.bokee.lzqdiy;

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

public class Travel{

    
/**
     * 
@param args
     
*/

    
public static void travel(List list)
    
{
        
if (list instanceof RandomAccess)
        
{
            System.out.println(
"实现了RandomAccess接口,不使用迭代器!");
            
for(int i=0;i<list.size();i++)
            
{
                System.out.println(list.get(i));
            }

        }

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

        }

    }

    
public static void main(String[] args)
    
{
        List list
=new ArrayList();
        list.add(
"a");
        list.add(
"b");
        travel(list);
        list
=new LinkedList(); 
        list.add(
"c");
        list.add(
"d");
        travel(list);
    }

}

补充:(2007年4月23日)
下面的程序用来测试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次时效果明显。


posted on 2007-04-22 11:29 我为J狂 阅读(4341) 评论(4)  编辑  收藏 所属分类: Java算法

评论

# re: 关于RandomAccess接口的研究 2007-04-22 20:41 cuichang

我认为你要想说明问题,应该用一些实际的数据说明问题,这样写代码,看不出什么来的啊
循环1000跳数据试一下不就 知道了吗  回复  更多评论   

# re: 关于RandomAccess接口的研究 2007-04-23 01:00 小飞鸟

确实啊 同意楼上同志的看法 循环1000次看看性能  回复  更多评论   

# re: 关于RandomAccess接口的研究 2007-04-23 11:07 我为J狂

谢谢上面朋友的建议,我补充了一个测试性能的程序,请大家验收。  回复  更多评论   

# re: 关于RandomAccess接口的研究 2007-05-08 15:45 刘娟

构精确的!!!  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

常用链接

留言簿(11)

随笔分类(48)

文章分类(29)

常去逛逛

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜