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)); 
         
        
       
      
     
    
   
  

你可能感兴趣的:(ConcurrentModificationException与ArrayList.subList)