apache和guava工具類partition方法分批list容易遇到的問題

背景: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生成一個新的使用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章