zoukankan      html  css  js  c++  java
  • ConcurrentModificationException与ArrayList.subList

    做项目的时候报了个ConcurrentModificationException,大概原因是调用ArrayList.subList方法导致的
    
    下面做个例子用于辅助解析:
    List list = new ArrayList();
    		for (int i = 0; i < 10; i++) {
    			list.add("a_" + i);
    		}
    
    		List list2 = list.subList(2, 8);
    		List list3 = list.subList(3, 7);
    		list2.remove(2);
    
    		for (String str : list3) {
    			System.out.print(str+",");
    		}
    运行上面的代码会报:Exception in thread "main" java.util.ConcurrentModificationException
    
    经过源码分析,知找到了具体原因:
        ArrayList.subList获取实例类型其实是java.util.ArrayList.SubList。
        在ArrayList.remove或SubList.remove的时候,有个记录修改次数的变量modCount(int类型)的值会增加1。
        SubList和SubList是个有点坑的变量,SubList.remove时候会同时使ArrayList和SubLis的modCount增加,但是ArrayList.remove的时候只会使的modCount增加。在执行了多个ArrayList.subList逻辑的时候,这些subList的modCount就会有些混乱
        刚好,SubList在迭代器获取下一个元素(就是for循环)的时候,SubList.modCount变量会与ArrayList的modCount与做校验,由于subList的modCount混乱的原因,就会导致报了ConcurrentModificationException
    
    解决方法,把subList方法的结果包在new ArrayList里面,如
    	List list2 = new ArrayList(list.subList(2, 8));
    	List list3 =  new ArrayList(list.subList(3, 7));
    
    
  • 相关阅读:
    C/C++中的堆、栈和队列
    网卡工作状态检测
    Delphi 2007 的midas程序注册问题
    使用SQL语句备份与恢复数据库
    C/C++中的堆、栈和队列
    Delphi 2007 的midas程序注册问题
    如何使用VirtualBox的共享文件夹(转)
    如何使用VirtualBox的共享文件夹(转)
    C语言struct的使用
    printf常用格式
  • 原文地址:https://www.cnblogs.com/dken/p/12628277.html
Copyright © 2011-2022 走看看