コレクション内の同時変更例外


に質問


私は1つの集合があって、以下、私は中に“world”のこの要素があるかどうかを判断したいです.もしあるならば、私は1つの“javaee”の要素を追加して、コードを書いて実現してください.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
( ConcurrentModificationException)
*/
public class ListIteratorDemo2 {
	public static void main(String[] args) {
		//  List 
		List list = new ArrayList();
		//  
		list.add("hello");
		list.add("world");
		list.add("java");

		//  
        
	     Iterator it = list.iterator();
		 while (it.hasNext()) {
		 String s = (String) it.next();
		 if ("world".equals(s)) {
		 list.add("javaee");

        System.out.println("list:" + list);
		 }
		}
    }
}

ConcurrentModificationException:メソッドがオブジェクトの同時変更を検出したが、この変更が許可されていない場合、この例外を放出します.

発生原因:


反復器は集合に依存して存在し,判断に成功した後,集合の中に要素が新たに追加されたが,反復器は知らなかったので,エラーを報告し,このエラーを同時修正異常と呼ぶ.実はこの問題は、反復器が要素を遍歴するとき、集合によって要素を修正することはできません.

解決方法:


A:反復器反復要素、反復器修正要素はさっき反復した要素の後ろについています.B:集合遍歴要素、集合修正要素(通常for)要素が最後に追加されました.
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListIteratorDemo2 {
	public static void main(String[] args) {
		//  List 
		List list = new ArrayList();
		//  
		list.add("hello");
		list.add("world");
		list.add("java");

	

		//  1: , 
		//  Iterator , ListIterator
		// ListIterator lit = list.listIterator();
		// while (lit.hasNext()) {
		// String s = (String) lit.next();
		// if ("world".equals(s)) {
		// lit.add("javaee");
		// }
		// }

		//  2: , ( for)
		for (int x = 0; x < list.size(); x++) {
			String s = (String) list.get(x);
			if ("world".equals(s)) {
				list.add("javaee");
			}
		}

		System.out.println("list:" + list);
	}
}