移除list中的元素, 移除list中元素时 java.util.ConcurrentModificationException

周五的时候公司的实习生问我自己写的代码有异常  java.util.ConcurrentModificationException, 我看到他的代码嗯....大概就是这么个情况, 当时我就...

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"A","B","C","D","E","C","C");
        for (String s : list) {
            if (s.equals("C")){
                list.remove(s);
            }
        }
        System.out.println(list);

运行这段代码

final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

可以看到, 当两值不相等时 则抛出异常 ConcurrentModificationException()

阿里规范明确表示 : 不要在forEach循环中进行元素的remove/add 操作 !

因为ArrayList是基于数组实现的, 是一个动态数组, 其容量能自动增长. ArrayList 不是线程安全的, 它是通过下标index进行访问的. 所以当你移除第一个C时, 集合大小已经减了1, 当最后移除时, 你的i 就会比集合的下标大, 两值不相等, 抛出异常... 

 话不多说, 那我们平时遇到类似的代码, 应该如何处理呢 ? (个人处理集合时 比较喜欢用stream)

  • stream
  • removeIf
  • iterator
  • removeAll

 看代码吧

// stream
List<String> notContainEleC = list.stream().filter(item -> !"C".equals(item)).collect(Collectors.toList());
System.out.println("stream" + notContainEleC);

// removeIf
list.removeIf(item -> item.equals("C"));
System.out.println("removeIf" + list);

// iterator
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
   String next = iterator.next();
      if ("C".equals(next)){
         iterator.remove();
       }
 }
System.out.println("iterator" + list);

//  removeAll
ArrayList<String> strings = new ArrayList<>(); 
strings.add("C");
list.removeAll(strings);
System.out.println("removeAll" + list);

推荐阅读

jdk8新特性stream流

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值