遍历ArrayList,Iterator和for循环哪个更快?

zxcvvcxz127 2010-02-23 03:43:35
加精
大家都说Iterator更快,但我测了一下,发现for循环更快,测试代码如下:

public static void main(String[] args) {
long start,end,forStart,forEnd;
ArrayList<Integer> al=new ArrayList<Integer>();
for(int i=0;i<900000;i++){
al.add(new Integer(4));
}

forStart=System.currentTimeMillis();
for(int j=0;j<al.size();j++){
al.get(j);
}
forEnd=System.currentTimeMillis();

Iterator<Integer> it=al.iterator();
start=System.currentTimeMillis();
while(it.hasNext()){
it.next();
}
end=System.currentTimeMillis();

System.out.println("for用时:"+(forEnd-forStart)+"\nIterator用时:"+(end-start));
}



运行结果:

for用时:16
Iterator用时:31

请高手解释一下……
...全文
9824 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlhlove 2011-12-07
  • 打赏
  • 举报
回复
只知道ArrayList是查询比较快,而linkedList是删除、插入比较快,具体的底层实现就不太清楚了。
过来学习了
某男 2011-09-26
  • 打赏
  • 举报
回复
用for来的快,但是习惯写Iterator,不知道在遍历的时候用那个比较好一些。希望有人举例一下同场景应用。
freshman312 2011-09-23
  • 打赏
  • 举报
回复
学习学习,ym各位大神!!!
bitray 2010-12-29
  • 打赏
  • 举报
回复
晕了,这玩意关键是看应用场合,和设计模式上。上来就讨论谁快意义是不大的,楼主用了90万次循环,那么你看看速度差了多少?10几毫秒?那么如果仅仅是几千条数据能看出来区别吗??


如果在小数据量上研究这个,不如研究下究竟哪种list更适合用什么方式取值。
如果大数据量上,对性能要求的已经很严格,在考虑这些吧
love_future 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chen09 的回复:]
引用 12 楼 liang8305 的回复:
你分析的方法不对,不能看时间,没意义;

去看两个的实现方法


这个说到点子上了。

ArrayList的iterator是在AbstractList里面的
它的next方法如下:

Java code

public E next() {
checkForComodification();……
[/Quote]

高手!这才是值的学习的对象
macrotea-cn 2010-05-22
  • 打赏
  • 举报
回复
路过学习
java小牛1 2010-03-09
  • 打赏
  • 举报
回复
14楼讲的很详细啊 学习了
孤独剑客 2010-03-03
  • 打赏
  • 举报
回复
学习了
dom72 2010-03-03
  • 打赏
  • 举报
回复
用增强的for循环最简单了。我一般用这个,,不行就用索引
langyashan119 2010-03-03
  • 打赏
  • 举报
回复
gggggggggggggggggggggggggggggggggggggg
fyjava1984 2010-03-03
  • 打赏
  • 举报
回复
ArrayList 和 LinkedList 是两个区别很大的集合, 没必要一起比嘛

Iterator 是集合提供的一个通用接口, 用来遍历集合元素的。在Collection下的集合都可以使用这个接口来遍历

提醒一下:用Iterator 迭代, 不是一样用了循环的嘛。
haosiniba 2010-03-03
  • 打赏
  • 举报
回复
FOR 比较快 主要是其他的那两个。。。我不是经常用
G_cofa 2010-03-03
  • 打赏
  • 举报
回复
这样的啊,用for loop ba, 不写java的路过。
steel1985 2010-03-03
  • 打赏
  • 举报
回复
引用 20 楼 abc130314 的回复:
ArrayList 是读取速度快。
LinkedList 是删除和插入速度快。

题外话:
如果给你一个List,你不知道用Iterator,还是for循环。可以用标记接口RandomAccess判断。


......
hejianmingwshjmrr 2010-03-03
  • 打赏
  • 举报
回复
这些问题还从来没考虑过
卡卡西CC 2010-03-03
  • 打赏
  • 举报
回复
引用 1 楼 jafapple 的回复:
Iterator 主要性能开销在next方法体,其一:对记录集进行检测,如果在迭代的过程中,记录集有被修改,会抛出异常;其二:next方法体内有try...catch方法体,这也会影响性能,JVM不能对try...catch块内的代码进行优化。
而for因为不管数据被中途修改,也不进行异常处理,所以当然快啦,

两种方式各用在不同的场景里,看需求了。


up。。。。。。。。。。
Z_FEI 2010-03-03
  • 打赏
  • 举报
回复
以前只是用,都没考虑过这些问题,学习了
hitlcyu19 2010-03-03
  • 打赏
  • 举报
回复
肯定是for效率高 回复内容太短了!
lovezx1028 2010-03-03
  • 打赏
  • 举报
回复
111111111111111
liushengmz 2010-03-02
  • 打赏
  • 举报
回复
对于遍历,一直以来都是经常讨论的东西。

现在之所有以这么多种存储的方式就是为了满足不同场合的使用,

单纯的对一个存储方式用不同方式的遍历测试用来说明这种方法

的效率是不客观的。所以我觉得没必要再讨论下去了,如果真的讨论下去,

那就把各种遍历、存储、插入、删除一起拿出来比较好了。。。

用标准的代码来测试它们之间的区别。。。。
加载更多回复(44)

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧