老师说用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循环,到底有什么区别呢?用哪个更好?

解决方案 »

  1.   

    for循环是语言中循环控制结构。
    而iterator则是用来遍历集合中的元素。本身是不能够循环遍历需要借助循环控制语句进行迭代元素。
    个人认为iterator封装了循环体遍历元素的细节,使得编程人员无需关心集合结构,以及访问元素的操作。
    例如:
    for(int i=0;i<size;i++){
     Object o=list.get(i);//List遍历元素
    }
    for(int i=0;i<size;i++){
     Object o=objects[i];//数组遍历元素
    }
    而对iterator来说,使用一个统一的接口来访问具体的集合元素.
    while(iterator.hasNext()){
     Object o=iterator.next();//统一的接口来访问具体的集合元素.
    }
      

  2.   

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

  3.   

    iterator代表的是一种模式,就如字面意义,迭代器模式
    你要说讨论iterator和for的效率问题
    这就像是在说鸡蛋和石头谁好吃一样,根本就不是一类东西,你在比较啥?
    iterator的效率要看他的实现代码是怎么样写的,难道iterator就不能用for来实现了吗?
      

  4.   

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

  5.   


    没有bench支持的都是信口开河
      

  6.   

    单纯从iterator出现的意义来说的话应该iterator快些,要不然就没有这个方法出现的必要了
      

  7.   

    import java.util.ArrayList;
    import java.util.Collections;
    import com.google.common.base.Stopwatch;
    import java.util.Iterator;public class Bench {
        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 Bench 
    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 Bench 
    loop times: 67108863
    init took: 1129ms
    for loop took: 3876ms
    foreach took: 3491ms
    iterator loop took: 4318ms
      

  8.   

    多谢各位的热心解答,不过从楼上huntor前辈的代码中,居然看到for循环比iterator效率还高,这个实在是太怪异了
      

  9.   

    推荐使用for each,统一调用iterator接口,更统一。
      

  10.   

    iterator 是collection和set都具有的一个属性 就像美元吧在中国不如人民币好使可是在全世界范围内 是通用的
      

  11.   

    我在看Map与List源码的时候并没有注意到for与iterator的效率区别,所以我觉得这两个应该区别不大的;个人觉得如果使用iterator的话需要生成额外的对象,可能过程会复杂一点
      

  12.   

    试着总结总结大家的帖子:
    1) foreach循环编译后还是被转成了iterator,所以效率应该没有区别
    2) iterator适用于所有集合类,而foreach并不是(?)
    这个总结不知各位前辈觉得怎样?
      

  13.   

    应该是这样的。另外,如果你写for(:),其实和用iterator是一样的。
      

  14.   

    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
      

  15.   

    这是因为他遍历的 是 ArrayList  换成 LinkedList 就不一样了
      

  16.   

    我测试过
    自己写个东西测试一下,Iterator去list集合内容就是要比for循环快,去一个含有10000元素的list集合的时候,for总是比iterator多耗费30~50ms