0

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

for-eachは、私が指摘した2番目のループタイプの単なるショートカットではありませんか?誰かがそこの違いを正確に説明できますか?

4

2 に答える 2

5

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

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

于 2012-05-03T14:31:51.087 に答える
3

for-eachこれは、Java1.5で導入された単なる構文糖衣です。Iterable舞台裏から取得したイテレータを使用しています。

あなたが言及した唯一の合理的な違いは、反復中のコレクションの変更です。はい、それは不可能です。を使用して反復中にコレクションを変更することはできませんIterator。試行によりConcurrentModificationException。これは両方の場合に関係します(イテレータの明示的および暗黙的な使用法)。

唯一の例外は使用Iterator.remove()です(サポートされている場合)。この場合、イテレータは例外をスローしません。

その理由は明らかです。イテレータは、変更を認識して自分自身を再配置できない限り、反復中に変更されているコレクションを反復することはできません。これは、を使用しているときに発生することですIterator.remove()

于 2012-05-03T14:34:54.143 に答える