2012-05-03 33 views
0

何度もfor-eachループが例外やクラッシュなどの問題を引き起こすケースがいくつか出てきましたが、for(it=list.iterator;it.hasNext();)は問題なく動作します。これには、コレクションの変更(for-eachでは起こりませんが、理由はわかりません)と他の場合にはクローンを作成することが含まれます。私はちょっと考えました。for-eachとforループ

私が指している2番目のループタイプのためのそれぞれのショートカットではありませんか?誰かが違いを正確に説明できましたか?

+0

http://stackoverflow.com/questions/7332190/using-iterator-interface-or-for-each-statement-in-java/7332496#7332496 –

答えて

3

for-eachは、java 1.5で導入された単なる構文糖です。シーンの背後にあるIterableから取得したイテレータを使用します。

唯一妥当な相違点は、反復中のコレクションの変更です。はい、不可能です。 Iteratorを使用して、反復中にコレクションを変更することはできません。この試みの原因はConcurrentModificationExceptionです。これは、両方の場合(イテレータの明示的および暗黙的な使用)に関係します。

唯一の例外はIterator.remove()(サポートされている場合)です。この場合、反復子は例外をスローしません。

理由はっきりしています。イテレータは、変更を知っていない限り、反復中に変更されているコレクションを反復することはできません。これはIterator.remove()を使用している場合に発生します。

5

foreachあなたがループの場合removeの要素に問題があります。イテレータを使用する場合はremoveメソッドがあります。 foreachを使用している場合、基礎となるイテレータに直接アクセスすることはできず、そのremoveメソッドを呼び出すことはできません。

それ以外は同じです。 Foreachは、より多くの問題やクラッシュを引き起こしません。要素を削除することはできません。