一次刪除集合中多個元素(解決併發修改異常問題)

在遍歷集合的同時,對集合進行了刪除操作。很容易遇到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 遍歷的,可以參照以上的兩種方法哈

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