一、问题描述
代码:
- 在代码中用到了hutool工具的ListUtil#split方法;
- 在切分list后,循环,并在循环里调用了removeAll方法;
现象描述:发现后续被切分的list集合,以及list集合的子集数量和我期望的对不上。
代码如下:
java
public static void test1(){
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
List<List<String>> split =ListUtil.split(list,3);
for (List<String> strings : split) {
remove(strings);
for (String string : strings) {
System.out.println(string);
}
}
}
public static void remove(List<String> strings){
List<String> removeList = new ArrayList<>();
removeList.add("1");
strings.removeAll(removeList);
}
我期望输出:
2
3
4
5
实际输出:
2
3
5
二、原因分析
- hutool的ListUtil#split内部用的是 list.subList;
- subList 执行结果是获取 ArrayList 的一部分,返回的是 ArrayList 的部分视图。对子集合的操作会反映到原集合, 对原集合的操作也会影响子集合;
- 说白了,你对子集合,remove数据,后面的就会顶上去;你add数据,就会加在后面。
断点分析:



其实源码里已经有说明了:

三、注意点及解决方法
- 在ListUtil#split后,不要去remove或者add元素;
- 新建list,用新的list来处理移除或新增逻辑;
- 不光是hutool的ListUtil#split方法哦,其他第三方的partition、subList方法都是一个原理!!