java.util.ConcurrentModificationException 异常

1 异常场景(Exception Scene)

当集合在进行迭代操作时,如果此时对集合的长度进行更改,就会报ConcurrentModificationException(并发修改异常)

2 异常示例(Exception Examples)

2.1 对List集合的"增,删"操作,改变了集合的长度,因此会报异常

	List<String> list = new ArrayList<>();
	list.add("1");
	list.add("2");
	list.add("3");
	for (String s : list) {
		list.add("4");
		list.remove(2);
	}

2.2 对Set集合的"增,删"操作,改变了集合的长度,因此会报异常

	Set<String> set = new HashSet<>();
	set.add("1");
	set.add("2");
	set.add("3");
	for (String s : set) {
		set.add("4");
		set.remove("2");
	}

2.3 对List集合的""操作,未改变集合的长度,因此无异常

	List<String> list = new ArrayList<>();
	list.add("1");
	list.add("2");
	list.add("3");
	for (String s : list) {
		System.out.println(s);
		list.set(2,"三");
	}

3 异常解决(Exception Solve)

3.1 原因分析

上面的例子中的for循环,都是采用的"增强for循环",底层是使用了"集合迭代器Iterator",因此迭代过程无法对集合长度进行修改

3.2 解决办法

3.2.1 解决List集合

使用"普通for循环"替代"增强for循环",在遍历集合的过程中就可以改变集合的长度了

	List<String> list = new ArrayList<>();
	list.add("1");
	list.add("2");
	list.add("3");
	for (int i = 0; i <= 3; i++) {
		if (i == 3) {
			list.add("4");
		}
		System.out.println(list.get(i));
	}

3.2.2 解决Set集合

(特别说明:对于Set集合的遍历,只能使用增强for循环)

做一个Set集合的"克隆Set", 用"克隆Set"进行增强for循环,但操作的却是"原始Set集合"

Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
// 做一个"克隆Set"
Set<String> setCopy = new HashSet<>();
for (String value : set) {
	setCopy.add(value);
}
for (String value : setCopy) {
	set.remove("2");
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值