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的内容。

apache和guava工具类partition方法分批list容易遇到的问题_第1张图片

错误情况demo

public class PartialListRemoveError {

    public static void main(String[] args) {
        List intList1 = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
        List> subs1 = Lists.partition(intList1, 3);
        for (List 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生成一个新的使用。

 

你可能感兴趣的:(java)