foreach循環刪除集合中的元素出現ConcurrentModificationException異常

------------------------------------ 題記

在使用foreach遍歷一個集合並在循環內部對該集合執行add或remove操作會引發ConcurrentModificationException異常。這是很早之前遇到的一個問題,當時查了下資料也沒做記錄和測試,所以今天便做了個測試,代碼中有詳細的解釋。

------------------------------------ 代碼

package collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
	public static void main(String[] args) {
		//---------聲明數組
		List<Integer> list = new ArrayList<Integer>();
		list.add(0);
		list.add(1);
		list.add(2);
		
		//foreach測試
		for(int n : list){
			System.out.println(n);
			list.remove(0);
//			if(n == 2) list.set(0,4);
			if(n == 2) list.add(3, 4);
//			if(n == 2) list.remove(1);
		}
		
		//iterator測試(foreach原理便是iterator)
//		for(Iterator<Integer> iterator = list.iterator(); iterator.hasNext();){
//			System.out.println("------------開始");
//			System.out.println("指針移動!");
//			int num = iterator.next();
//			System.out.println("打印當前元素:" + num);
//			if(num == 0) {
//				System.out.println("執行刪除!");
//				list.remove(0);
//			}
//		}
		
		/*
		 * 整個過程中,iterator的指針只進行過一次定義,所以它的指針會保持爲第一時的狀態,
		 * 然而在循環執行過程中,list集合發生了長度上的變動,
		 * 所以對應的iterator指針也應該做相應的調整,因爲物理位置發生了改變,
		 * 但可惜的是,iterator還是保持第一次聲明時的狀態,
		 * 所以這個時候iterator.next()指針所保持的物理地址已經不符合當前要求了,
		 * 故會拋出java.util.ConcurrentModificationException該異常。
		 */
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章