4

次のコードを実行していますが、実行時にある種の同時実行例外が発生することがあります。

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クラスのアクセスレベルの違いは何ですか?

4

4 に答える 4

8

違いは主に構文糖衣ですが、反復しているIteratorアイテムからアイテムを削除できる点が異なります。Collection技術的には、拡張ループを使用すると、少なくともsと配列の両方を含むforすべてのものをループできます。IterableCollection

パフォーマンスの違いについて心配する必要はありません。このようなマイクロ最適化は、無関係な注意散漫です。移動中にアイテムを削除する必要がある場合は、を使用してIteratorください。それ以外の場合for、ループは読みやすいという理由だけで使用される傾向があります。

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

vs:

for (Iterator<String> iter = stringList.iterator(); iter.hasNext(); ) {
  String s = iter.next();
  ...
}
于 2010-07-06T02:38:12.143 に答える
0

あなたが話している「ある種の並行性例外」はおそらくそう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構文を使用することはできません)。

于 2010-07-06T06:52:37.573 に答える
0

舞台裏では、新しいスタイルforはコンパイラーによってイテレーターの観点から実装されているため、自分でそれを行っても違いはありません。

于 2010-07-06T06:03:12.647 に答える
0

Iterator(interface)は、List、Set、Queueなどのコレクションでのみ使用できますが、ループごとに、CollectionsやArrayなどの反復可能なすべてのものに使用できます。そして、foreachループはより読みやすくなっています。

于 2013-06-02T13:46:06.810 に答える