JAva iterator反復ArrayList

1618 ワード

久しぶりに自分のブログに行って、ちょうど今日少し时間があって、何かを書いて、iterator反復arraylistについて.面白い感じがして、記録する価値があります.
      最初のコードは次のとおりです.
 
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()メソッドが位置を特定できないと推定される.