2011-03-31 148 views
3

可能重复:
What are the Advantages of Enhanced for loop and Iterator in Java ?
Is there a performance difference between a for loop and a for-each loop?迭代器与循环以及为什么迭代器是作为循环引入的?

下面的代码显示了与两个for循环以及与迭代器,我们可以遍历集合中的元素则是做什么用的区别循环和迭代器,以及为什么我们应该只使用迭代器的情况下收集

ArrayList<String> list=new ArrayList<String>(); 
    list.add("dipu"); 
    list.add("alok"); 
    list.add("alok"); 
    list.add("jyoti"); 
    ArrayList<Integer> al=new ArrayList<Integer>(); 
    al.add(1); 
    al.add(2); 
    String a[]={"a","b"}; 
    for(int i=0;i<list.size();i++) 
    { 
     System.out.println(list.get(i));; 
    } 
    for(Integer t:al) 
    { 
     System.out.println(t); 
    } 
    for (Iterator iter = list.iterator(); iter.hasNext();) 
     { 
     System.out.println(iter.next()); 
     } 
    Iterator it=list.iterator(); 
    while(it.hasNext()) 
    { 
    String st=it.next().toString(); 
    System.out.println(st); 
    } 
+0

增强的for循环的速度比正常的循环访问元素正常一点,但不是基于阵列的集合,因为他们可以立即访问与轻松 – Kurru 2011-03-31 18:50:12

回答

1

迭代器通常更安全我会说,没有访问索引的风险不存在。它们也具有更多的灵活性,因为您可以随着它们前后移动,而for循环只有一种方式,并且在多种语言中,您不能更改循环内循环索引的值(即无法更改增量率)。

它们也是在迭代中从集合中移除项目的唯一方法。当你在for循环中删除某个项目时,这将是灾难性的,并且通常甚至不被Java允许,我忘记了什么是异常,但是我之前已经有了一个。

想一想,一旦你删除了项目,所有其他的项目下移。同时在您的下一次迭代中,您的索引仍然增加意味着2件事。

首先,您将跳过下一个元素,因为它已经转移到刚删除的位置。

其次是你的循环将超出你现在改变的集合的大小。

+0

索引我还没有在Java中试过,但我知道您可以使用其他语言的for循环修改数组。只要您为您插入/移除的项目增加/减少索引变量,并在每次循环迭代中重新计算数组的长度,则不会有任何问题 – 2011-03-31 18:42:35

+0

您可以在正常for循环中编辑列表。不在迭代器中。如果你从列表中删除一个项目,他们通常会失败 – Kurru 2011-03-31 18:49:20

+0

@Sam Dufel - 我相信这个问题是关于集合而不是数组,它们是非常不同的。 @Kurru - 什么?迭代器有一个'remove()'方法,用于删除最近一次'next()'调用返回的元素。我非常怀疑迭代器会失败,如果你使用它,看到它提供....也许你可以在正常的循环中编辑/从集合中删除,但为什么你想要当你可以更安全地做到这一点? – gnomed 2011-04-01 16:33:32

0

您正在迭代的'流'可能甚至不可索引。也就是说,迭代器使得一个非常方便的“懒惰评估”模式成为可能,即在迭代器请求数据之前,数据甚至不会被加载/构建。这对存储库和数据库访问以及网络来说非常棒。

1

我尝试用两个短句子来解释:

  • 随着在它增强的for循环其更容易循环(更多人类可读的..)
  • 随着迭代这是可能在迭代期间修改列表,这是与其他方法不可能的
2

虽然我不熟悉Java Iterator,但它似乎非常相似到.NET的IEnumerable。

枚举/迭代器的优点是:

  • 你不必知道的集合,它在某些情况下可能需要N个步骤来确定的尺寸,增加了执行时间(尽管它技术上保持线性)。相反,你只是继续前进到下一个元素,直到没有任何元素。

  • 由于不需要知道集合的基数,因此迭代器可以动态生成集合,或者在开始处理已有的元素时“添加元素”。例如,你可以从迭代器和/或重载迭代器获取器中派生出来,创建“懒惰地”生成有限或无限序列的类,找出可枚举集合中的每个元素是什么时候请求它,而不是定义集合时。您还可以设置一个缓冲流,在其中处理您收到的记录,数据包等,而另一个线程或进程在您之前运行,以供您排队等待处理。

  • 任何集合,可以提供一个迭代可以以完全相同的方式被遍历,而不必知道它是否是可转位的,什么方法或构件是规定大小,等等等等等等迭代器实现从而提供一种适配器允许相同的代码在传递给它的任何集合上工作。

  • Java是否具有与.NET扩展方法(静态方法不是类定义的一部分,但是可以在类型实例上工作并且可以像实例方法一样调用)的等效方法?如果是这样,你可以定义一些方法来获取一个迭代器并产生一个结果,这可能是另一个迭代器。 .NET的Linq库很大程度上依赖于这些库,提供了一个非常强大的集合操作框架,允许将通用操作链接在一起,每个操作都根据前一操作的结果进行操作。