原文链接:http://guowww.diandian.com/post/2010-09-10/15970717
今天在阅读代码的时候发现一段比较难以理解的for循环,突然对List的遍历有了兴趣,于是上网看了一下,这小小的东西真有不少的技巧。
同事说遍历数组的时候,优先顺序应该是:foreach>for>while,于是针对这个进行了一个简单的测试。
以下是测试代码:
public static long testForloops(List list) {
long start = 0L, end = 0L;
@SuppressWarnings("nused"
String le = null;
start = System.nanoTime();
for (int i = list.size() - 1; i >=0; --i) {
le = list.get(i);
}
end = System.nanoTime();
return end - start;
}
public static long testIterator(List list) {
long start = 0L, end = 0L;
@SuppressWarnings("nused")
String le = null;
start = System.nanoTime();
Iterator it = list.iterator();
while (it.hasNext()) {
le = it.next();
}
end = System.nanoTime();
return end - start;
}
public static long testForIterator(List list){
long start = 0L, end = 0L;
@SuppressWarnings("unused")
String le = null;
start=System.nanoTime();
for(Iterator it = list.iterator(); it.hasNext();){
le=it.next();
}
end=System.nanoTime();
return end-start;
}
public static long testForeach(List list){
long start = 0L, end = 0L;
@SuppressWarnings("unused")
String le = null;
start=System.nanoTime();
for(String str: list){
le=str;
}
end=System.nanoTime();
return end-start;
}
public static void main(String[] args) {
//测试列表长度
final int LEN = 1000;
//初始化测试用数据
List arraylist = new ArrayList(LEN);
List linkedlist = new LinkedList();
for (int i = 0; i < LEN; ++i) {
String s = Integer.toString(i, 2);
arraylist.add(s);
linkedlist.add(s);
}
//打印测试结果
final String FORMAT = "%1$-12s%2$-12s%3$16d\n";
System.out.println("List\t\tType\t\tTime(nanoseconds)");
System.out.println("-------------------------------------------------");
System.out.printf(FORMAT, "ArrayList", "for", testForloops(arraylist));
System.out.printf(FORMAT, "LinkedList", "for", testForloops(linkedlist));
System.out.printf(FORMAT, "Arraylist", "foreach", testForeach(arraylist));
System.out.printf(FORMAT, "LinkedList", "foreach", testForeach(linkedlist));
System.out.printf(FORMAT, "ArrayList", "whileIterator", testIterator(arraylist));
System.out.printf(FORMAT, "LinkedList", "whileIterator", testIterator(linkedlist));
System.out.printf(FORMAT, "Arraylist", "forIterator", testForIterator(arraylist));
System.out.printf(FORMAT, "LinkedList", "forIterator", testForIterator(linkedlist));
}
测试的两组结果如下,结果一:
List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 101000
LinkedList for 907441
Arraylist foreach 630418
LinkedList foreach 366857
ArrayList whileIterator 512606
LinkedList whileIterator 520227
Arraylist forIterator 72222
LinkedList forIterator 63289
结果二:
List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 93269
LinkedList for 833748
Arraylist foreach 271374
LinkedList foreach 366950
ArrayList whileIterator 208049
LinkedList whileIterator 281161
Arraylist forIterator 92102
LinkedList forIterator 63695
从这个结果我们可以发现:对于ArrayList和LinkedList,同一种循环方式有着不同的结果。这种差距尤其是在for循环中,LinkedList简直慢死了(数组再大点的话,这种差距在好几个数量级以上)。
上面的结果也告诉我们一个事实,List的迭代while循环式很慢的,基本在任何List循环中我们可以抛弃。
针对ArrayList,我们看出的结果是:ArrayList的迭代for循环最快,其次是普通的for循环,然后是foreach和迭代while循环。
针对LinkedList,我们的结果是:LinkedList的迭代for循环最快,其次是foreach和迭代while循环,最慢的是for循环。