iterator vs for循环和为什么迭代器被引入,因为我们有循环?

时间:2011-03-31 18:31:33

标签: java iterator

  

可能重复:
  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循环和迭代器,我们可以迭代集合的元素,然后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);
    }

4 个答案:

答案 0 :(得分:2)

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

枚举器/迭代器的优点是:

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

  • 由于不必知道集合的基数,因此迭代器可以允许动态生成集合,或者在开始处理已有内容时添加元素进行“流式处理”。例如,您可以从Iterator和/或重载迭代器getter派生,以创建生成有限或无限系列“懒惰”的类,在您要求它时,而不是在定义集合时,确定可枚举集合中的每个元素。您还可以设置一个缓冲流,您可以在其中处理已收到的记录,数据包等,而另一个线程或进程可以在您前面排队等待更多工作。

  • 任何可以提供迭代器的集合都可以以完全相同的方式遍历,而不必知道它是否可索引,定义大小的方法或成员等等等。迭代器实现因此提供了适配器允许相同的代码处理传递给它的任何集合。

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

答案 1 :(得分:1)

我会说,迭代器通常更安全,没有访问不存在的索引的风险。它们还具有更大的灵活性,因为你可以使用它们前后转发而对于循环只有一种方式,而且在许多语言中你不能改变循环中循环索引的值(即你不能改变增量速率)。

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

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

首先,当你移动到刚删除的位置时,你将跳过下一个元素。

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

答案 2 :(得分:1)

我试着用两个短句来解释它:

  • 使用增强的for循环,它更容易循环(更易于人类阅读..)
  • 使用迭代器可以在迭代期间修改列表,这与其他方法不可能

答案 3 :(得分:0)

您正在迭代的“流”可能甚至不可编入索引。也就是说,迭代器使得一种非常方便的“延迟评估”模式成为可能,在迭代器要求数据之前,数据甚至不被加载/构造。这对于存储库和数据库访问以及网络来说非常有用。