-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 番目のケースで、このサイクルでオブジェクトを削除しようとすると、同時変更例外が発生することがわかりました。

4

2 に答える 2

6

最初の例では、リストを自分で反復処理しています。反復中にコレクションを変更する場合は、反復の状態を維持する責任を負う必要があります。

2 番目の例では、使用している「foreach」ループは、暗黙Iteratorのバックグラウンドを使用しています。アクティブなIteratorでコレクションを自分で変更すると、ConcurrentModificationException.

の使用中に要素を削除する必要がある場合はIterator、明示的な を使用しますIterator

for(Iterator<Object> itr = list.iterator(); itr.hasNext())
{
    Object o = itr.next():
    if (decideToRemove)
        itr.remove();
}

の操作では、 をスローせずに要素を削除できIteratorます。removeConcurrentModificationException

于 2013-07-09T18:12:27.980 に答える
0

コレクションから削除する適切な方法は、次のような 3 番目の種類のループを使用することです。

    for (Iterator<Object> iterator = new ArrayList<>().iterator(); iterator.hasNext(); ) {
        Object o = iterator.next();
        if (someCondition())
            iterator.remove();
    }
于 2013-07-09T18:13:35.160 に答える