遍历容器的时候,用Iterator还是for循环,哪个效率更高?

bigbro001 2011-11-25 01:54:33
老师说用Iterator的时候,编译器会自动完成一些东西,可是反编译以下这段代码:

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

public class IteratorTest {
public static void main(String[] args)
{
ArrayList<String> str = new ArrayList();
for (int i = 0; i <=20; i++)
{
str.add("String" + i);
}

for (String myStr : str)
{
System.out.println(myStr);
}

for (Iterator i = str.iterator(); i.hasNext();)
{
System.out.println(i.next());
}
}
}


用cavaj反编译后的代码如下:

import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;

public class IteratorTest
{

public IteratorTest()
{
}

public static void main(String args[])
{
ArrayList str = new ArrayList();
for(int i = 0; i <= 20; i++)
{
str.add((new StringBuilder()).append("String").append(i).toString());
}

String myStr;
for(Iterator i$ = str.iterator(); i$.hasNext(); System.out.println(myStr))
{
myStr = (String)i$.next();
}

for(Iterator i = str.iterator(); i.hasNext(); System.out.println(i.next())) { }
}
}

请问在效率上,用iterator和用for循环,到底有什么区别呢?用哪个更好?
...全文
6225 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoliu123586 2013-04-15
  • 打赏
  • 举报
回复
引用 5 楼 bigbro001 的回复:
刚刚用System.nanoTime();测试过了,时间上感觉没什么区别啊,为什么老师会说iterator的效率高一些呢。。。
我测试过 自己写个东西测试一下,Iterator去list集合内容就是要比for循环快,去一个含有10000元素的list集合的时候,for总是比iterator多耗费30~50ms
fredzhouxiaowei 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
多谢各位的热心解答,不过从楼上huntor前辈的代码中,居然看到for循环比iterator效率还高,这个实在是太怪异了。。。
[/Quote]
这是因为他遍历的 是 ArrayList 换成 LinkedList 就不一样了
bigbro001 2012-05-21
  • 打赏
  • 举报
回复
Java语言规范一书中写道:

The enhanced for statement is equivalent to a basic for statement of the form:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
VariableModifiersopt TargetType Identifier =
(TargetType) #i.next();
Statement
}

由此可见,二者是没有区别的

引用链接:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14.2
meichen8050753 2012-05-14
  • 打赏
  • 举报
回复
其实效率是一样的。。不用纠结这些
bigbro001 2012-05-12
  • 打赏
  • 举报
回复
不知ZangXT大侠有什么指教?
bigbro001 2011-12-30
  • 打赏
  • 举报
回复
试着总结总结大家的帖子:
1) foreach循环编译后还是被转成了iterator,所以效率应该没有区别
2) iterator适用于所有集合类,而foreach并不是(?)
这个总结不知各位前辈觉得怎样?
chadguo 2011-12-30
  • 打赏
  • 举报
回复
我在看Map与List源码的时候并没有注意到for与iterator的效率区别,所以我觉得这两个应该区别不大的;个人觉得如果使用iterator的话需要生成额外的对象,可能过程会复杂一点
zhoujiaolongde 2011-12-30
  • 打赏
  • 举报
回复
iterator 是collection和set都具有的一个属性 就像美元吧在中国不如人民币好使可是在全世界范围内 是通用的
孤雨 2011-12-30
  • 打赏
  • 举报
回复
你把数据放大点,时间应该就会有区别了,数据量小的话其实是看不出来的。
bayougeng 2011-12-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chdw 的回复:]

对于声明了RandomAccessList(ArrayList有,LinkedList没有)来说,for稍高于iterator
但是对于没有声明的,则iterator远远高于for
[/Quote]
应该是这样的。

另外,如果你写for(:),其实和用iterator是一样的。
smst1987 2011-12-28
  • 打赏
  • 举报
回复
推荐使用for each,统一调用iterator接口,更统一。
bigbro001 2011-12-28
  • 打赏
  • 举报
回复
期待ZangXT大侠的指点。。。
LucEaspe 2011-11-27
  • 打赏
  • 举报
回复
for each 啊
zsxwdwl 2011-11-27
  • 打赏
  • 举报
回复
如此之复杂,小辈实属难以看懂!
bigbro001 2011-11-27
  • 打赏
  • 举报
回复
多谢各位的热心解答,不过从楼上huntor前辈的代码中,居然看到for循环比iterator效率还高,这个实在是太怪异了。。。
huntor 2011-11-26
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.Collections;
import com.google.common.base.Stopwatch;
import java.util.Iterator;

public class Benchmark {
public static void main(final java.lang.String[] args) {
final int SIZE = Integer.MAX_VALUE / 32;
System.out.printf("loop times: %d%n",SIZE);
Stopwatch stopwatch = new Stopwatch().start();
ArrayList<String> list = new ArrayList<>(SIZE);
for (int i = 0; i < SIZE; i++) {
list.add(" ");
}
long millis = stopwatch.elapsedMillis();
System.out.printf("init took: %dms%n",millis);

StringBuilder builder = new StringBuilder(SIZE);
stopwatch = stopwatch.reset().start();
for (int i = 0; i < SIZE; i++) {
builder.append(list.get(i));
}
millis = stopwatch.elapsedMillis();
System.out.printf("for loop took: %dms%n",millis);

builder.delete(0,SIZE);
stopwatch = stopwatch.reset().start();
for (String v : list) {
builder.append(v);
}
millis = stopwatch.elapsedMillis();
System.out.printf("foreach took: %dms%n",millis);

builder.delete(0,SIZE);
stopwatch = stopwatch.reset().start();
for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) {
builder.append(iter.next());
}
millis = stopwatch.elapsedMillis();
System.out.printf("iterator loop took: %dms%n",millis);
}
}

Oracle JDK 7u1
java -Xmx512m  -cp .:guava-10.0.jar Benchmark 
loop times: 67108863
init took: 1601ms
for loop took: 3688ms
foreach took: 4766ms
iterator loop took: 4546ms

java -server -Xmx512m  -cp .:guava-10.0.jar Benchmark 
loop times: 67108863
init took: 1129ms
for loop took: 3876ms
foreach took: 3491ms
iterator loop took: 4318ms

codolio 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chdw 的回复:]

对于声明了RandomAccessList(ArrayList有,LinkedList没有)来说,for稍高于iterator
但是对于没有声明的,则iterator远远高于for
[/Quote]

学习了。
feiba9 2011-11-26
  • 打赏
  • 举报
回复
单纯从iterator出现的意义来说的话应该iterator快些,要不然就没有这个方法出现的必要了
龙腾冰 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chdw 的回复:]

对于声明了RandomAccessList(ArrayList有,LinkedList没有)来说,for稍高于iterator
但是对于没有声明的,则iterator远远高于for
[/Quote]
+1
huntor 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bigbro001 的回复:]

刚刚用System.nanoTime();测试过了,时间上感觉没什么区别啊,为什么老师会说iterator的效率高一些呢。。。
[/Quote]

没有benchmark支持的都是信口开河
加载更多回复(6)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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