一次删除集合中多个元素(解决并发修改异常问题)
在遍历集合的同时,对集合进行了删除操作。很容易遇到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 遍历的,可以参照以上的两种方法哈