【问题标题】:iterator vs for loop and why iterator was introduced as we had for loop? [duplicate]迭代器与 for 循环以及为什么像我们的 for 循环那样引入迭代器? [复制]
【发布时间】:2011-07-27 03:35:15
【问题描述】:

可能的重复:
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);
    }

【问题讨论】:

  • 增强的 for 循环在正常访问元素时比普通 for 循环快一点,但不适用于基于数组的集合,因为它们可以轻松地立即访问索引

标签: java iterator


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我试着用两句话来解释:

    • 增强的 for 循环更容易循环(更易于阅读......)
    • 使用 iterators 可以在迭代期间修改列表,这是其他方法无法实现的

    【讨论】:

      【解决方案3】:

      您正在迭代的“流”甚至可能无法索引。也就是说,迭代器使一个非常方便的“惰性求值”模式成为可能,在迭代器请求数据之前,甚至不会加载/构造数据。这对于存储库和数据库访问以及网络非常有用。

      【讨论】:

        【解决方案4】:

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

        它们也是在遍历集合时从集合中删除项目的唯一方法。在 for 循环中从集合中删除一个项目将是灾难性的,Java 通常甚至不允许,我忘记了例外是什么,但我以前有一个这样做过。

        想一想,一旦您移除该项目,所有其他项目都会向下移动。同时,在您的下一次迭代中,您的索引仍然增加,这意味着 2 件事。

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

        其次,您的循环将超出您现在更改的集合的大小。

        【讨论】:

        • 我没有在 Java 中尝试过这个,但我知道您可以在其他语言中从 for 循环中修改数组。只要您为插入/删除的项目增加/减少索引变量,并在每次循环迭代时重新计算数组的长度,您就不会有任何问题
        • 您可以在正常的 for 循环中编辑列表。不在迭代器中。如果您从列表中删除项目,它们通常会失败
        • @Sam Dufel - 我相信这个问题是关于集合而不是非常不同的数组。 @Kurru - 什么?迭代器有一个remove() 方法,它删除最近一次next() 调用返回的元素。我非常怀疑如果您按照提供的方式使用它,迭代器会失败......也许您可以在正常的 for 循环中编辑/从集合中删除,但是当您可以更安全地执行此操作时,您为什么要这样做?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-05
        • 1970-01-01
        • 2015-02-08
        • 2016-06-20
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多