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


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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 联想笔记本电脑键盘亮了屏幕不亮_联想笔记本电脑键盘为什么不亮

    联想笔记本电脑键盘亮了屏幕不亮_联想笔记本电脑键盘为什么不亮现在不管是工作还是学习,已经离不开电脑了,它的出现带给我们极大的方便,笔记本以它小巧灵活的体积更是受到了很多学生和商务人士的喜欢,可是市面上有那么多品牌的笔记本,应该怎么正确做出选择呢?下面小编就为大家带来联想笔记本电脑开机键亮但是黑屏,联想笔记本键盘没反应?联想笔记本电脑开机键亮但是黑屏1、若遇到联想笔记本电脑开机键亮但是黑屏的情况,可以拆卸掉笔记本背面的电池,只用电源适配器连接电脑,尝试开机一…

    2022年9月20日
    2
  • 如何遍历ArrayList集合,并安全删除其中的元素[通俗易懂]

    如何遍历ArrayList集合,并安全删除其中的元素[通俗易懂]如何遍历ArrayList集合,并安全删除其中的元素?1、遍历ArrayList集合有三种方式(1)for循环(2)增强for循环,也就是foreach(3)迭代器iterator2、普通for循环遍历删除元素,list集合的大小会变小,而索引也会发生改变,所以利用ffor循环遍历删除元素会漏调某些元素。例如我for循环遍历删除第一个元素,接着按照…

    2022年7月22日
    16
  • 阿里云轻量应用服务器、ECS云服务器和虚拟主机的区别

    阿里云轻量应用服务器、ECS云服务器和虚拟主机的区别阿里云轻量应用服务器、ECS云服务器和虚拟主机区别在哪?这三种机型都可以建站,不过对于不同用户来说还是有区别的。下面老魏从难易程度、权限等方面来说说。比较简单的是云虚拟主机,系统已经预装建站环境,用户安装程序后就可以建站了,不过权限很少,适用于入门级建站首选;而云服务器的对用户技术要求高一些,用户要自行搭建环境,自由程度很高,可以自由配置服务器,需要有专业技术人员来维护;轻量应用服务器是给新…

    2022年6月25日
    32
  • mysql查看数据库的日志文件_怎么查看mysql数据库的日志文件「建议收藏」

    mysql查看数据库的日志文件_怎么查看mysql数据库的日志文件「建议收藏」2017-10-16回答一.错误日志错误日志在mysql数据库中很重要,它记录着mysqld启动和停止,以及服务器在运行过程中发生的任何错误的相关信息。1.配置信息–log-error=[file-name]用来指定错误日志存放的位置。如果没有指定[file-name],默认hostname.err做为文件名,默认存放在datadir目录中。也可以将log-error配置到my.cnf文件中,…

    2022年10月14日
    2
  • genre-based_deepsort特征判断

    genre-based_deepsort特征判断  https://arxiv.org/abs/1804.01438https://blog.csdn.net/gavinmiaoc/article/details/80648754https://zhuanlan.zhihu.com/p/35296881 https://github.com/seathiefwang/MGN-pytorch

    2022年9月26日
    5
  • php header函数导出excel表格

    php header函数导出excel表格

    2021年10月26日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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