List遍历:for,foreach还是Iterator?

转自:http://blog.csdn.net/nazir2513/article/details/51168345

先说现象:

如果是 ArrayList,用三种方式遍历的速度是for>Iterator>foreach,但基本上属于同一个速度级别;

如果是 LinkedList,则三种方式遍历的差距很大了,用for遍历的效率远远落后于foreach和Iterator,Iterator>foreach>>>for;

模拟50000条数据,放入ArrayList和LinkedList,对两个List分别用三种方式进行遍历,耗时如下图所示:

这里写图片描述

究其原因:

  首先发现foreach和Iterator基本上都在一个速度级别,但Iterator会稍稍快于foreach,事实上,foreach就是基于Iterator实现的。也就是说下面两段代码效果是一样的:所以foreach和Iterator基本是效率相当的,但foreach比Iterator慢的时间我猜测就是foreach隐式转换成Iterator所消耗的时间,所以接下去我们就撇开foreach了不谈了

  2:接下来要解释的是为什么ArrayList的遍历中for比Iterator快,而LinkedList中却是Iterator远快于for?

  这得从ArrayList和LinkedList两者的数据结构说起了: ArrayList是基于索引(index)的数组,索引在数组中搜索和读取数据的时间复杂度是O(1),但是要增加和删除数据却是开销很大的,因为这需要重排数组中的所有数据。 LinkedList的底层实现则是一个双向循环带头节点的链表,因此LinkedList中插入或删除的时间复杂度仅为O(1),但是获取数据的时间复杂度却是O(n)。 明白了两种List的区别之后,就知道,ArrayList用for循环随机读取的速度是很快的,因为ArrayList的下标是明确的,读取一个数据的时间复杂度仅为O(1)。但LinkedList若是用for来遍历效率很低,读取一个数据的时间复杂度就达到了为O(n)。而用Iterator的next()则是顺着链表节点顺序读取数据的效率就很高了。

  最后总结:

      1:ArrayList用三种遍历方式都差得不算太多,一般都会用for或者foreach,因为Iterator写法相对复杂一些。当然在三种都能实现的情况下,具体用那种方式,原则就是:看你的心情。。。

      2:LinkedList的话,我会毫无疑问用foreach或者Iterator。

      3:有理解不到位的,欢迎请指正!

时间: 2024-10-02 20:57:43

List遍历:for,foreach还是Iterator?的相关文章

for、foreach和Iterator遍历有什么(效率)区别

(问:1.for.foreach和Iterator遍历有什么区别    2.遍历删除ConcurrentModificationException异常.) 1.在形式上 for的形式是 for(int i=0;i<arr.size();i++){...} foreach的形式是 for(int i:arr){...} iterator的形式是 Iterator it = arr.iterator(); while(it.hasNext()){ object o =it.next(); ...}

for 、foreach和iterator的区别

相同点:   三个都可以用来遍历数组和集合 不同点:1.形式差别 for的形式是 for(int i=0;i<arr.size();i++){...} foreach的形式是 for(int i:arr){...} iterator的形式是 Iterator it = arr.iterator(); while(it.hasNext()){ object o =it.next(); ...} 2.条件差别 for需要知道集合或数组的大小,而且需要是有序的,不然无法遍历: foreach和iter

for,foreach,iterator的用法和区别

不同点: 1.形式差别 for的形式是 for(int i=0;i<arr.size();i++){...} foreach的形式是 for(int i:arr){...} iterator的形式是 Iterator it = arr.iterator() while(it.hasNext()){ object o =it.next(); ...} 2.条件差别 for需要知道集合或数组的大小,而且需要是有序的,不然无法遍历: foreach和iterator都不需要知道集合或数组的大小,他们都

Javascript 数组循环遍历之forEach

Javascript 数组循环遍历之forEach 数组循环变量,最先想到的就是 for(var i=0;i<count;i++)这样的方式了. 除此之外,也可以使用较简便的forEach 方式 2.  forEach 函数. Firefox 和Chrome 的Array 类型都有forEach的函数.使用如下: [html] view plain copy <!--Add by oscar999--> <!DOCTYPE HTML PUBLIC "-//W3C//DTD

for 、foreach 、iterator 三种遍历方式的比较

习惯用法 for.foreach循环.iterator迭代器都是我们常用的一种遍历方式,你可以用它来遍历任何东西:包括数组.集合等 for 惯用法: List<String> list = new ArrayList<String>(); String[] arr = new String[]{"1,2,3,4"}; for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } for(i

遍历数组 foreach

package com.java.array; public class Myforeach { public static void main(String[] ARGS){ /* int arr[] = {2,3,6,7};*/ /* for(int x : arr){ System.out.println(x); }*/ //使用普通的 for循环 /*for(int i = 0; i<arr.length; i++){ System.out.println(arr[i]); }*/ //

PHP正则表达式;数组:for()遍历、 foreach ()遍历、each()list()组合遍历;指针遍历

正则表达式:$s = "he8llo5wor6ld";$s = preg_replace("/\d/","#",$s);   //按照正则表达式替换$attr = preg_split("/\d/",$s);   //按照正则表达式拆分$arr = array();preg_match("/\d/",$s,$arr);   //匹配满足正则的第一个字符串preg_match_all("/\d/&q

Mybatis遍历查询 ——foreach

第一步: 在xxxMapper接口中添加一个函数,返回一个list,这里的参数是一个integer类型的集合 public List<Emp> findEmpByList(@Param("list") List<Integer> list); 第二步: 在xxxMapper.xml 中添加statement语句(SQL语句). 如SQL语句:select * from employee where id in (1 ,2 , 3,4 ); <select

手写js代码(一)javascript数组循环遍历之forEach

注:原文地址http://blog.csdn.net/oscar999/article/details/8671546 我这里是仿照学习! 1.js的数组循环遍历 ①数组的遍历首先想到的是for()循环语句 var arr = ['summer','i','love', 'you']; for(var i=0, length=arr.length; i<length; i++) { alert(arr[i]); } ②其次,比较简单的方法 forEach() FireFox 和Chrome的Ar