【问题标题】:Performance difference between Iterator Class and foreach construct迭代器类和 foreach 构造之间的性能差异
【发布时间】:2011-03-12 02:54:48
【问题描述】:

我正在运行以下代码,但有时在运行时会遇到某种并发异常。

ArrayList<Mob> carriers = new ArrayList<Mob>();
ArrayList<Mob> mobs = new ArrayList<Mob>();
...
for (Mob carrier : carriers){
    for (Mob mob : mobs){
        checkInfections (carrier, mob);
    } 
}

我对其进行了重构以解决并发问题,但它确实让我提出了一个问题。如果我将 for 构造更改为 Iterator 模式,性能会有所不同吗? foreach 构造和 Iterator 类的访问级别有何不同?

【问题讨论】:

    标签: java design-patterns concurrentmodification


    【解决方案1】:

    您只能在 List、Set 和 Queue 等集合上使用 Iterator(interface),但对于每个循环都可以用于所有可迭代的事物,例如 Collections 和 Array。而且对于每个循环都更具可读性..

    【讨论】:

      【解决方案2】:

      您所说的“某种并发异常”很可能是java.util.ConcurrentModificationException。你得到这个是因为你在迭代列表时不能改变它;如果你这样做,迭代器会注意到并抛出这个异常。

      如果您需要在迭代列表时从列表中删除元素,则通过迭代器上的remove() 方法来完成,例如:

      List<String> list = ...; // wherever you get this
      
      for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) {
          String s = iter.next();
          if (...) {
              iter.remove(); // Remove element through iterator
          }
      }
      

      (注意:在这种情况下,您不能对循环使用 foreach 语法,因为您需要显式访问迭代器)。

      【讨论】:

        【解决方案3】:

        在幕后,新样式 for 是由编译器根据迭代器实现的,所以如果你自己这样做也没有什么区别。

        【讨论】:

          【解决方案4】:

          区别主要在于语法糖,除了Iterator 可以从它正在迭代的Collection 中删除项目。从技术上讲,增强的for 循环允许您循环任何Iterable,其中至少包括Collections 和数组。

          不用担心性能差异。这种微优化是一种无关紧要的干扰。如果您需要随时删除项目,请使用Iterator。否则,for 循环往往会被更多地使用,因为它们更具可读性,即:

          for (String s : stringList) { ... }
          

          对比:

          for (Iterator<String> iter = stringList.iterator(); iter.hasNext(); ) {
            String s = iter.next();
            ...
          }
          

          【讨论】:

          • 为了超级迂腐,增强的for 循环允许您循环任何Iterable 或数组,而数组不是Iterable
          • @ColinD 我在第一段中提到了这一点。
          • 实际上,我对您在第一段中的措辞方式持迂腐态度。
          猜你喜欢
          • 2011-04-29
          • 2019-06-06
          • 2020-01-05
          • 1970-01-01
          • 2011-08-13
          • 1970-01-01
          • 2011-01-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多