遍历list 集合 使用 iterator 和get 谁更快速?


使用 Iterator 的好处在于可以使用相同方式去遍历集合(List 是有序集合)中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口)。
比如楼主例子中,如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 TreeSet 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整。



--------------------------------------------

Java code
?
1
2
3
4
5
6
----------测试ArrayList-----------
iterator操作:80ms
get操作:40ms
----------测试LinkedList-----------
iterator操作:110ms
get操作:140ms

结论:ArrayList随机访问更快,LinkedList顺序访问更快



-----------------------------------------------------------

一个完整的遍历速度测试:

Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import  java.util.Iterator;
import  java.util.List;
import  java.util.ArrayList;
import  java.util.LinkedList;
 
/**
  * IteratorTest
  * @author SageZk
  */
public  class  IteratorTest {
 
     public  static  long  testForloops(List<String> list) {
         long  start = 0L, end = 0L;
         @SuppressWarnings ( "unused" )
         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<String> list) {
         long  start = 0L, end = 0L;
         @SuppressWarnings ( "unused" )
         String le =  null ;
         start = System.nanoTime();
         Iterator<String> it = list.iterator();
         while  (it.hasNext()) {
             le = it.next();
         }
         end = System.nanoTime();
         return  end - start;
     }
 
     public  static  void  main(String[] args) {
         //测试列表长度
         final  int  LEN =  10000 ;
 
         //初始化测试用数据
         List<String> arraylist =  new  ArrayList<String>();
         List<String> linkedlist =  new  LinkedList<String>();
         for  ( int  i =  0 ; i < LEN; ++i) {
             String s = Integer.toString(i,  2 );
             arraylist.add(s);
             linkedlist.add(s);
         }
 
         //打印测试结果
         final  String FORMAT =  "%1$-16s%2$-16s%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,  "ArrayList" "Iterator" , testIterator(arraylist));
         System.out.printf(FORMAT,  "LinkedList" "for" , testForloops(linkedlist));
         System.out.printf(FORMAT,  "LinkedList" "Iterator" , testIterator(linkedlist));
     }
 
}


以下是 3 组测试结果:

[code=BatchFile]List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1189258
ArrayList       Iterator                 2365594
LinkedList      for                    152396254
LinkedList      Iterator                 2340801

List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1235701
ArrayList       Iterator                 4249982
LinkedList      for                    149825606
LinkedList      Iterator                 2525531

List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1198267
ArrayList       Iterator                 2584617
LinkedList      for                    150382451
LinkedList      Iterator                 2347994
[/code]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值