一次删除集合中多个元素(解决并发修改异常问题)

在遍历集合的同时,对集合进行了删除操作。很容易遇到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 遍历的,可以参照以上的两种方法哈

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