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

转载地址:
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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值