java基础——java.util.ConcurrentModificationException

在编写代码的时候,有时候会遇到List里有符合条件的的对象,就移除改对象! 但是这中操作如:使用了 List 的remove,会导致一些很严重的问题!

大家好,又见面了,我是全栈君。

在编写代码的时候,有时候会遇到List里有符合条件的的对象,就移除改对象!
但是这种操作如:使用了 List 的remove,会导致一些很严重的问题!
如下这段代码使用ArrayList:

@Test
    public void testRemoveList(){
        List<String> list = new ArrayList<String>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        list.add("E");
        for (String string : list) {
            System.out.println(string);
            if("C".equals(string)){
                list.remove(string);
            }
        }
    }

程序运行,报错!!!

java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at com.test.common.TestCommon.testRemoveList(TestCommon.java:318)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

这里写图片描述

千万要记住,不要在循环集合的时候去操作集合的长度!!!!
千万要记住,不要在循环集合的时候去操作集合的长度!!!!
千万要记住,不要在循环集合的时候去操作集合的长度!!!!

这里在小小的说一下,foreach 这个循环,它的原理底层实现其实是
使用了 Iterator!

解决方法,
(1)使用一个临时的集合,如下代码:

@Test
    public void testRemoveList(){
        try {
  
  //如果是不重要的业务代码。可以加上try-catch 不要影响主流程的进行

            List<String> list = new ArrayList<String>();
            list.add("A");
            list.add("B");
            list.add("C");
            list.add("D");
            list.add("E");

            if(list.size() > 0){
  
  //循环List一定去判断 非null 和 List-size() > 0
                List<String> templist = new ArrayList<String>();
                for (String string : list) {
                    System.out.println(string);
                    if(!"C".equals(string)){
                        templist.add(string);
                    }
                }
                System.out.println(templist.toString());
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

总结,其实这个是一个fail-fast 机制

fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

(2)使用 CopyOnWriteArrayList ,在java.util.concurrent包下,多线程的时候使用,线程安全的!
将上面代码中的ArrayList换成CopyOnWirteArrayList也不会报错!

参考资料:
fail-fast 机制:http://www.cnblogs.com/skywang12345/p/3308762.html

Java中如何删除一个集合中的多个元素:http://www.importnew.com/20959.html


不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121210.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • long类型转化为int_int与long相加结果为

    long类型转化为int_int与long相加结果为一、强制类型转换Longlong=300000;inti=(int)long;二、调用intValue()方法inti=newLong(30000).intValue();三、先把long转换成字符串String,然后在转行成Integerlonglong=300000;inti=Integer.parseInt(String.valueOf(ll));对于采用queryRunner.query(connection,sql,newSc…

  • CSS3选择器02—CSS3部分选择器

    该部分主要为CSS3新增的选择器接上一篇CSS(CSS3)选择器(1)一.通用兄弟选择器:24:E~F,匹配任何E元素之后的同级F元素。二.属性选择器:25:E[att^=val]

  • pycharm怎么导入cv2_pycharm导入cv2「建议收藏」

    pycharm怎么导入cv2_pycharm导入cv2「建议收藏」pycharm导入cv2pycharm导入cv2最近才开始接触python,经师哥推荐,使用了Pycharm作为编程软件。自己在学图像处理方面的知识,接触OoenCV比较多,以前接触的是C++,使用VS2012进行编译,配置。学习的程序会有importcv2这条语句,我刚开始的想法是在File下面找到Deafaultsettings,再找到ProjectInterpreter,找到…

  • 如何用51单片机控制步进电机运动「建议收藏」

    如何用51单片机控制步进电机运动「建议收藏」本来接触单片机挺久了的,但是一直只是停留在非常初级的认识阶段,本科的时候上过几门课,但是从来没有自己捣鼓过单片机,这次突然来了兴趣,感觉一下子学到了好多东西,在这里好好整理一下。这篇文章只适合于入门阶段的小白阅读,高手请绕道。12年年初的时候购买了一套普中科技的“单片机开发试验仪”,好多次想好好学学,结果每一次都半途而废,主要原因还是周围的人都不会用,有问题都不知道找谁问,结果锁到箱子里一直到现在。

  • 什么是跨域?跨域解决方法

    什么是跨域?跨域解决方法一、为什么会出现跨域问题出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协…

  • UPX脱壳详细分析

    UPX脱壳详细分析文章标题】:UPX脱壳详细分析【文章作者】:index09【使用工具】:UPX+OD+Stud_PE+ImportREC——————————————————————————–【详细过程】又被R公司鄙视了,每次都被相同的理由鄙视。哭……于是决定好好学一下逆向了。首先做个幼儿级的脱壳练习,当做开始吧。网上有很多类似文章,基本只写了找OEP的过程,这里稍加分

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号