Java中List的各种循环方式对比

原文链接: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循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值