ArrayList支持三种遍历方式。
1、第一种,随机访问,它是通过索引值去遍历(这种效率高)
由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素。
代码如下:
// 基本的for
for (int i = 0; i < size; i++)
{
value = list.get(i);
}
2、第二种,foreach语句
foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。
代码如下:
for (Integer integer : list)
{
value = integer;
}
3、第三种,Iterator迭代器方式
迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。
代码如下:
for (Iterator iterator = list.iterator(); iterator.hasNext()
{
value = iterator.next();
}
或者
Iterator iterator = list.iterator();
while (iterator.hasNext()){
value=iterator.next();
}
package cn.Objects;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListfor {
public static void main(String[] args)
{
// 准备数据阶段
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10000; i++)
{
list.add(i);
}
// 测试阶段
int runCounts = 1000; // 执行次s数
int listSize = list.size();
int value;
// For循环的测试
long startTime1 = System.currentTimeMillis();
for (int i = 0; i < runCounts; i++)
{
loopOfFor(list);
}
long endTime1 = System.currentTimeMillis();
// Foreach循环的测试
long startTime2 = System.currentTimeMillis();
for (int i = 0; i < runCounts; i++)
{
loopOfForeach(list);
}
long endTime2 = System.currentTimeMillis();
// Iterator迭代器的测试
long startTime3 = System.currentTimeMillis();
for (int i = 0; i < runCounts; i++)
{
loopOfIterator(list);
}
long endTime3 = System.currentTimeMillis();
System.out.println("loopOfFor: " + (endTime1-startTime1)+ "ms");
System.out.println("loopOfForeach: "+ (endTime2-startTime2)+ "ms");
System.out.println("loopOfIterator: "+ (endTime3-startTime3)+ "ms");
}
/**
* 由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素。
* @param list
*/
public static void loopOfFor(List<Integer> list)
{
int value;
int size = list.size();
// 基本的for
for (int i = 0; i < size; i++)
{
value = list.get(i);
}
}
/**
* 使用forecah方法遍历数组
* @param list
*/
public static void loopOfForeach(List<Integer> list)
{
int value;
// foreach
for (Integer integer : list)
{
value = integer;
}
}
/**
* 通过迭代器方式遍历数组
* @param list
*/
public static void loopOfIterator(List<Integer> list)
{
int value;
// iterator
/*for (Iterator iterator = list.iterator(); iterator.hasNext();)
{
value = iterator.next();
}*/
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
value=iterator.next();
}
}
}
输出结果:
第一次:
loopOfFor: 72ms
loopOfForeach: 89ms
loopOfIterator: 91ms
第二次:
loopOfFor: 70ms
loopOfForeach: 90ms
loopOfIterator: 87ms
从运行结果可以看出,loopOfFor耗时最少,效率最高,但是loopOfForeach和loopOfIterator之间的关系,有点不明确。
因此,我决定增大运行次数,设置runCounts = 10000。
输出结果:
第一次:
loopOfFor: 668ms
loopOfForeach: 760ms
loopOfIterator: 679ms
第二次:
loopOfFor: 672ms
loopOfForeach: 751ms
loopOfIterator: 678ms
这次发现,loopOfForeach效率低于loopOfIterator。
总结:从实验结果来看,在遍历ArrayList中,效率最高的是loopOfFor。loopOfForeach和loopOfIterator之间关系不明确,但在增大运行次数时,loopOfIterator效率高于loopOfForeach。