------------------------------------ 題記
在使用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該異常。
*/
}
}