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);
}
}
*@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);
}
}
}
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次时效果明显。
转自:http://blog.csdn.net/geggegeda/article/details/2708181
相关推荐
最简单的RandomAccess中文读写文件示例
NULL 博文链接:https://lidongfu005.iteye.com/blog/2012223
主要介绍了java 中RandomAccess接口源码分析的相关资料,需要的朋友可以参考下
A Study on Random Access Performance in Next Generation Mobile Network Systems
different random access methods comparison
计算机导论课件:Random Access Memory.pptx
C++编写的随机访问文件程序,支持对文件的读,写,修改文件,添加文件,删除文件
The system block diagram as shown in Figure 1 is designed to capture and store frames captured by the camera on the RC10 board in real-time into block random access memory
RAM存储的耦合故障检测逻辑,基础性论文 March Test Algorithm for 3-Coupling Faults in Random Access Memories
下面小编就为大家带来一篇Java接口RandomAccess全面了解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
CAJ文件,几种随机接入协议的仿真性能比较分析
5G蜂窝物联网中大规模机器型通信的速率分裂随机接入机制_Rate-Splitting Random Access Mechanism for Massive Machine Type Communications in 5G Cellular Internet-of-Things.pdf
提示您在一周中的意外时间记录您的想法 您是否曾经想写日记,却没有时间写一篇日记? 好吧,日记为您找到时间了! 随机存取存储器是一个弹出窗口,它会在一周中以随机设置的间隔出现,以供您反射和书写。...
锆掺杂的氧化锌薄膜多比特阻变存储器的双极和单极阻变模式,许定林,唐明华,文中我们报道了锆掺杂的氧化锌器件的单极和双极阻变模式的共存,第一次测试过程之后,具有单极型阻变行为的这种器件在关闭过程中
tomassstorage(slowestandleastexpensive).Cachememory,immediatelyaccessiblebythecentralprocessingunit,isusuallystaticrandom-accessmemory(SRAM).Mainmemoryisusuallydynamicrandom-accessmemory(DRAM);...
FDD-LTE系统中的一种高精度时延估计的随机接入检测算法,彭飞龙,王卫东,在长期演进(LTE)的上行链路传输中,一个用户设备(UE)必须在正常的数据传输之前进行时间同步。所以,物理随机接入信道(PRACH)��
Random access Channel simulation with Matlab/simulink
今天不看源码(想看源码的同学可以自己在本机进行查阅),只是大概说一下这三者的区别。方便大家能够在面试的时候说出这三者的不同。 ArrayList方面 ...RandomAccess只是一个标记接口,接口RandomAccess中
Research and Implementation of Random Access in LTE System
前端开源库-random-access-storage随机存取存储器,轻松制作随机存取存储器实例