Java_各種Exception解析


1、Exception in thread "main" java.util.ConcurrentModificationException


まずプログラムを見てみましょう
public class TestFor {

	public static void oldFor(List<String> list) {
		for (int i = 0; i < list.size(); i++) {
			String str = list.get(i);
			if (str.equals("2")) {
				list.remove(i);
			}
		}
	}

	public static void newFor(List<String> list) {
		for (String str : list) {
			if (str.equals("2")) {
				list.remove(str);
			}
		}
	}

	public static void main(String[] args) {
		List<String> list1 = new ArrayList<String>();
		list1.add("1");
		list1.add("2");
		list1.add("3");
		list1.add("4");
		list1.add("5");
		list1.add("6");
		oldFor(list1);
		System.out.println(list1);
		
		List<String> list2 = new ArrayList<String>();
		list2.add("1");
		list2.add("2");
		list2.add("3");
		list2.add("4");
		list2.add("5");
		list2.add("6");
		newFor(list2);
		System.out.println(list1);
	}
}

このプログラムはException in thread"main"javaに報告します.util.ConcurrentModificationException、newFor(list 2);この1行の新聞.
これはなぜですか.
プログラム内のforeach文
        for (String str : list) {             if (str.equals("2")) {                 list.remove(str);             }         }
次の反復器に相当します
        for (Iterator it = list.iterator(); it.hasNext();) {             String str = it.next();             if (str.equals("2")) {                 list.remove(str);             }         }
List,Set,Mapは反復する際に自身の長さの変更は許されないので,反復の内部ではList,Set,Mapのaddメソッドとremoveメソッドの使用は許されない.
この点を避ける愚かな方法がある.
	public static void newFor(List<String> list) {
		List<String> removeList = new ArrayList<String>();
		for (String str : list) {
			if (str.equals("2")) {
				removeList.add(str);
			}
		}
		list.removeAll(removeList);
	}

これも確かに問題を解決することができますが、方法は本当に重くて、実はもっと簡単で効率的な方法があります.Iteratorを使うことです.removeメソッドは、次のとおりです.
	public static void newFor(List<String> list) {
		for (Iterator<String> it = list.iterator(); it.hasNext();) {
			String str = it.next();
			if (str.equals("2")) {
				it.remove();
			}
		}
	}