java.util.ConcurrentModificationException 报错的问题

这篇文章显示了解决java.util.ConcurrentModificationExceptionfor 的问题ArrayList。

该错误消息如下所示:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	...
	...

问题

您可能要遍历ArrayList,并在某些特定条件下删除某些元素。例如,以下代码看起来很合理:

List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
 
for (String s : list) {
    if (s.equals("B")) {
        list.remove(s);
    }
}

实际上,运行代码将导致以下异常:
在这里插入图片描述
解决方案1

Iterator可以用来解决这个问题。Iterators允许调用者在迭代过程中从基础集合中删除元素。

Iterator<String> iter = list.iterator();
while(iter.hasNext()){
    String str = iter.next();
    if( str.equals("B")){
        iter.remove();
    }
}

解决方案2

代替ArrayList,CopyOnWriteArrayList可以用来解决问题。CopyOnWriteArrayList是线程安全的变体,ArrayList其中所有可变操作(添加,设置等)都通过对基础数组进行全新复制来实现。

List<String> list = new CopyOnWriteArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
 
for (String s : list) {
    if (s.equals("B")) {
        list.remove(s);
    }
}

其他数据结构(例如HashSet,LinkedList等)也是如此。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值