繁体   English   中英

Iterator Class和foreach构造之间的性能差异

[英]Performance difference between Iterator Class and foreach construct

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

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类之间的访问级别差异是什么?

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

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

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

VS:

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

您可以仅对List,Set和Queue等集合使用Iterator(接口),但是每个循环cab都可用于像Collections和Array这样可迭代的所有内容。 而且每个循环都更具可读性..

幕后制作新样式for在迭代器方面由编译器实现的,所以不会有区别,如果你这样做你自己。

你所谈论的“某种并发异常”很可能是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语法,因为您需要显式访问迭代器)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM