【问题标题】:What are the benefits of using an iterator in Java在 Java 中使用迭代器有什么好处
【发布时间】:2010-08-29 17:22:23
【问题描述】:

我正在浏览以下代码示例:

public class GenericTest {
  public static void main (String[] args) {
    ArrayList<String> myList = new ArrayList<String>();
    String s1 = "one";
    String s2 = "two";
    String s3 = "three";

    myList.add(s1); myList.add(s2); myList.add(s3);

    Iterator<String> itr = myList.iterator();
    String st;

    while (itr.hasNext()) {
      st = itr.next();
      System.out.println(st);
    }
  }
}

我想知道使用 Iterator 接口的实现而不是使用普通的 for-each 循环有什么好处?

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

如果这个例子不相关,什么情况下我们应该使用迭代器?

【问题讨论】:

标签: java iterator


【解决方案1】:

基本上,foreach 循环是迭代器最常用的一种快捷方式。也就是说,遍历所有元素。但也有一些区别:

  • 您可以直接使用 foreach 循环遍历数组
  • 您可以使用迭代器删除对象,但不能使用 foreach 循环来完成
  • 有时将迭代器传递给函数(特别是递归函数)很有用

【讨论】:

    【解决方案2】:

    For-Each 循环是在 Java 5 中引入的,所以它并不那么“旧”。

    如果你只想迭代一个集合,你应该使用 for each 循环

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

    但有时“plain old”IteratorhasNext() 方法对于检查迭代器是否有更多元素非常有用。

    for (Iterator<String> it = myList.iterator(); it.hasNext(); ) {
       String str = it.next();
       System.out.print(str);
       if (it.hasNext()) {
          System.out.print(";");     
       }
    }
    

    您也可以调用it.remove() 来移除next 返回的最新元素。

    还有ListIterator&lt;E&gt; 提供双向遍历it.next()it.previous()

    因此,它们不等价。两者都需要。

    【讨论】:

      【解决方案3】:

      如果您只是对集合/数组进行迭代,我认为在大多数情况下使用这两种方法都不会带来任何性能优势。但根据您的用例,用法可能会有所不同。

      • 如果您的案例只是迭代 在列表中,使用for each 循环应该是首选,因为 Java 1.5.
      • 但如果您的案例受到操纵 迭代时收集你需要 使用迭代器接口。

      【讨论】:

        【解决方案4】:
        for ( String str : myList ) { System.out.println(str); }
        

        此代码实际上将使用 myList.Iterator 对列表进行迭代。

        自 java 5 以来添加的新 for 循环使对集合和数组的迭代更容易。

        通过 Iterator,Java Collection 中的每个实现都可以有自己的迭代方式(List、Set、LinkedList、Map 或 ....)

        您也可以在自定义类中实现此接口。让其他代码迭代您对象内部的元素。

        【讨论】:

          【解决方案5】:

          迭代器是对集合实现方式的抽象。它允许您一次浏览整个集合,可选择删除项目。

          迭代器的缺点是,如果您知道底层实现,它可能会很慢。例如,对 ArrayList 使用 Iterator 比只为每个元素调用 ArrayList.get(i) 慢得多。这是否重要取决于代码在做什么。

          【讨论】:

            【解决方案6】:

            在几乎所有情况下,两者在操作和性能上都是等效的。唯一的区别是旧版本的 Java JVM 支持迭代器,而新的“for”语法仅在 JSDK 1.5(“Java 5”)中引入,有些人希望保持与 1.4 或更早版本的兼容性。

            【讨论】:

              【解决方案7】:

              为了能够在迭代时安全地从集合中删除元素,并避免ConcurrentModificationException,以防您需要在迭代时从循环中删除元素

              请参考this question

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-06-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-09-27
                • 2012-10-11
                • 1970-01-01
                • 2011-01-11
                相关资源
                最近更新 更多