背景:java代碼分批和分割list,是使用apche和guava的工具類做的,(具體的使用這工具類的方法看鏈接:https://blog.csdn.net/Mint6/article/details/102875247)分割後foreach的過程調用remove會報錯java.util.NoSuchElementException
原因:apache和guava分割list,都是使用的假分割subList,list還是原來那個list只不過根據傳進去的大小,每一小段用一個新的list引用指向了。如下圖:小list並不是生成了新的對象,所以修改小list還是會修改整體list的內容。
錯誤情況demo
public class PartialListRemoveError {
public static void main(String[] args) {
List<Integer> intList1 = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> subs1 = Lists.partition(intList1, 3);
for (List<Integer> list : subs1) {
list.clear();
System.out.println("輸出總list" + intList1);
}
}
}
代碼執行結果:
輸出總list[4, 5, 6, 7, 8]
輸出總list[4, 5, 6]
Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:364)
at formal.util.list.PartialListRemoveError.main(PartialListRemoveError.java:17)
總結:由於每個小list引用還是執向的整體list,所以刪除小list內容的時候,也就是刪除整體list的內容了。這個就轉換成了list在foreach的時候不能remove的問題(這個問題看另外文章:1.錯誤演示:https://blog.csdn.net/Mint6/article/details/81047349 2.錯誤底層分析:https://blog.csdn.net/mint6/article/details/77684609)
解決辦法:把裏面的小list生成一個新的使用。