您的位置:首页 > 其它

List三种遍历方式及效率问题

2017-04-11 20:45 357 查看
转载地址:
http://www.cnblogs.com/chenxqNo01/p/6372594.html
第一种:迭代器遍历

for(Iterator<String>    it    =    list.iterator();    it.hasNext();    )    {   

       ....   

   }   

这种方式在循环执行过程中会进行数据锁定,性能稍差(是不是因为锁定的原因有待商榷),同时如果你想在循环过程中去掉某个元素,只能调用it.remove方法,不能使用list.remove方法,否则一定出现并发访问的错误。

 

第二种:增强for循环

 for(String   data    :    list)    {   

       .....   

   }   

内部调用第一种,换汤不换药,因此比Iterator慢,这种循环方式还有其他限制,不建议使用它

 

第三种:

 for(int    i=0;    i<list.size();    i++)    {   

       A    a    =    list.get(i);   

       ...   

   }   

  内部不锁定, 效率最高,但是当写多线程时要考虑并发操作的问题。

对于声明了RandomAccessList(顺序访问和随机访问的概念见另外一篇介绍)(ArrayList有,LinkedList没有)来说,for稍高于iterator但是对于没有声明的,则iterator远远高于for。

ArrayList例子:

package test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {

public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i <= 10000000; i++) {
list.add(i);
}

int k = 0;
long startTmFor = System.nanoTime();
for (int i = 0; i < list.size(); i++) {
k += list.get(i);
}
long endTmFor = System.nanoTime();
System.out.println("传统for循环遍历时间为:" + (endTmFor - startTmFor));

k = 0;
long startTmFor2 = System.nanoTime();
for(Integer i : list){
k += i;
}
long endTmFor2 = System.nanoTime();
System.out.println("增强for循环遍历时间为:" + (endTmFor2 - startTmFor2));

Iterator<Integer> iterator = list.iterator();
long startTmIterator = System.nanoTime();
while (iterator.hasNext()) {
k += iterator.next();
}
long endTmForIterator = System.nanoTime();
System.out.println("Iterator循环遍历时间为:" + (endTmForIterator - startTmIterator));

}

}


执行结果:

传统for循环遍历时间为:45032505

增强for循环遍历时间为:65176018

Iterator循环遍历时间为:74390863

改为LinkList:

package test;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Test {

public static void main(String[] args) {
List<Integer> list = new LinkedList<Integer>();
for (int i = 0; i <= 10000; i++) {
list.add(i);
}

int k = 0;
long startTmFor = System.nanoTime();
for (int i = 0; i < list.size(); i++) {
k += list.get(i);
}
long endTmFor = System.nanoTime();
System.out.println("传统for循环遍历时间为:" + (endTmFor - startTmFor));

k = 0;
long startTmFor2 = System.nanoTime();
for(Integer i : list){
k += i;
}
long endTmFor2 = System.nanoTime();
System.out.println("增强for循环遍历时间为:" + (endTmFor2 - startTmFor2));

Iterator<Integer> iterator = list.iterator();
long startTmIterator = System.nanoTime();
while (iterator.hasNext()) {
k += iterator.next();
}
long endTmForIterator = System.nanoTime();
System.out.println("Iterator循环遍历时间为:" + (endTmForIterator - startTmIterator));

}

}

执行结果:

传统for循环遍历时间为:152612694

增强for循环遍历时间为:25283813

Iterator循环遍历时间为:772936
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: