作项目的时候报了个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));