反復する方法が 2 つある場合:
初め :
Object ob;
ArrayList<Obect> list;
for(int i=0;i<list.size();i++)
{ //Todo}
2番 :
Object ob;
ArrayList<Obect> list;
for(Object o:list)
{ //Todo}
違いは何ですか?2 番目のケースで、このサイクルでオブジェクトを削除しようとすると、同時変更例外が発生することがわかりました。
反復する方法が 2 つある場合:
初め :
Object ob;
ArrayList<Obect> list;
for(int i=0;i<list.size();i++)
{ //Todo}
2番 :
Object ob;
ArrayList<Obect> list;
for(Object o:list)
{ //Todo}
違いは何ですか?2 番目のケースで、このサイクルでオブジェクトを削除しようとすると、同時変更例外が発生することがわかりました。
最初の例では、リストを自分で反復処理しています。反復中にコレクションを変更する場合は、反復の状態を維持する責任を負う必要があります。
2 番目の例では、使用している「foreach」ループは、暗黙Iterator
のバックグラウンドを使用しています。アクティブなIterator
でコレクションを自分で変更すると、ConcurrentModificationException
.
の使用中に要素を削除する必要がある場合はIterator
、明示的な を使用しますIterator
。
for(Iterator<Object> itr = list.iterator(); itr.hasNext())
{
Object o = itr.next():
if (decideToRemove)
itr.remove();
}
の操作では、 をスローせずに要素を削除できIterator
ます。remove
ConcurrentModificationException
コレクションから削除する適切な方法は、次のような 3 番目の種類のループを使用することです。
for (Iterator<Object> iterator = new ArrayList<>().iterator(); iterator.hasNext(); ) {
Object o = iterator.next();
if (someCondition())
iterator.remove();
}