作項目的時候報了個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));