在遍歷集合的同時,對集合進行了刪除操作。很容易遇到java.util.ConcurrentModificationException異常
什麼是併發修改異常?
遍歷集合的同時,刪除集合中的元素。這時集合的list.size發生改變(因爲刪除了1個) 產生了錯誤。即在遍歷集合的同時不能對集合進行刪除操作。下面引用一段話:
迭代器是依賴於集合而存在的,在判斷成功後,集合中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫併發修改異常。
簡單描述就是:迭代器遍歷元素的時候,通過集合是不能修改元素的。
下面代碼 就是在遍歷集合的同時,對集合進行了刪除操作。
產生了如下異常java.util.ConcurrentModificationException
解決方案
思路一 :在對集合進行刪除操作之後,break跳出循環,不再繼續遍歷集合。(只能刪除單個元素)
static void DeleteList(Map<Integer,Integer> map){
for (int key :map.keySet()){
if(map.get(key)%3==0);
System.out.println(key+" "+map.get(key));
map.remove(key);
berak;//跳出循環
}
}
思路二:先遍歷,後刪除。1.遍歷集合,確定需要刪除的對象,用List暫存。2.對比List中的數據,刪除原集合中的數據。(一次刪除多個元素)
static void DeleteList(Map<Integer,Integer> map){
List<Integer> list=new ArrayList<Integer>();
for (int key :map.keySet()){
if(map.get(key)%3==0){
list.add(key);//用List暫存 待刪除的key
};
}
for(int i :list){
System.out.println(i+" 刪除 "+map.get(i));
map.remove(i);
}//對比List中的數據,按照key刪除
}
小結
最後其實還有一個最簡單的解決方案。
問題在於:迭代器迭代元素的時候,不能用集合修改元素(增強for的本質是用了迭代器哦== 也就是說 相當於用了迭代器遍歷,集合修改)
所以: 集合遍歷元素(普通for),集合修改元素可以直接解決問題。
但是對於set、map集合 是沒辦法運用普通for 遍歷的,可以參照以上的兩種方法哈