JAva iterator反復ArrayList
1618 ワード
久しぶりに自分のブログに行って、ちょうど今日少し时間があって、何かを書いて、iterator反復arraylistについて.面白い感じがして、記録する価値があります.
最初のコードは次のとおりです.
この場合の異常情報は次のとおりです.
理解できない修正コードは以下の通りです.
コードを実行します.正しいです.
両端コードの唯一の違いはlistからaを除去するタイミングにある.
第1セグメントコードはiteratorの第2反復前にlist.remove()を呼び出す
第2セグメントコードはiteratorの第2反復後にlist.remove()メソッドを統一的に呼び出す.
これによりリストの変更によりiterator.next()メソッドが位置を特定できないと推定される.
最初のコードは次のとおりです.
Iterator iterator = list.iterator();
while(iterator.hasNext()){
int a = (Integer)iterator.next();
list.remove(Integer.valueOf(a));
if(iterator.hasNext()){
int b = (Integer)iterator.next();
list.remove(Integer.valueOf(b));
list.add(a+b);
iterator = null;
System.gc();
iterator = list.iterator();
}
}
この場合の異常情報は次のとおりです.
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
理解できない修正コードは以下の通りです.
while(iterator.hasNext()){
int a = (Integer)iterator.next();
if(iterator.hasNext()){
Integer b = (Integer)iterator.next();
list.remove(Integer.valueOf(a));
list.remove(Integer.valueOf(b));
list.add(a+b);
iterator = null;
System.gc();
iterator = list.iterator();
}
}
コードを実行します.正しいです.
両端コードの唯一の違いはlistからaを除去するタイミングにある.
第1セグメントコードはiteratorの第2反復前にlist.remove()を呼び出す
第2セグメントコードはiteratorの第2反復後にlist.remove()メソッドを統一的に呼び出す.
これによりリストの変更によりiterator.next()メソッドが位置を特定できないと推定される.