ListUtil#split和remove搭配使用的坑
一、问题描述代码在代码中用到了hutool工具的ListUtil#split方法在切分list后循环并在循环里调用了removeAll方法现象描述发现后续被切分的list集合以及list集合的子集数量和我期望的对不上。代码如下publicstaticvoidtest1(){ListStringlistnewArrayList();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);ListListStringsplitListUtil.split(list,3);for(ListStringstrings:split){remove(strings);for(Stringstring:strings){System.out.println(string);}}}publicstaticvoidremove(ListStringstrings){ListStringremoveListnewArrayList();removeList.add(1);strings.removeAll(removeList);}我期望输出2345实际输出235二、原因分析hutool的ListUtil#split内部用的是 list.subListsubList 执行结果是获取 ArrayList 的一部分返回的是 ArrayList 的部分视图。对子集合的操作会反映到原集合 对原集合的操作也会影响子集合说白了你对子集合remove数据后面的就会顶上去你add数据就会加在后面。断点分析其实源码里已经有说明了三、注意点及解决方法在ListUtil#split后不要去remove或者add元素新建list用新的list来处理移除或新增逻辑不光是hutool的ListUtil#split方法哦其他第三方的partition、subList方法都是一个原理