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

本文深入解析Java中遍历集合同时删除元素导致的并发修改异常,提供两种有效解决方案:一是删除单个元素后立即退出循环;二是先遍历并记录待删除元素,再统一删除。并给出代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值