ListUtil#split和remove搭配使用的坑

一、问题描述

代码:

  1. 在代码中用到了hutool工具的ListUtil#split方法;
  2. 在切分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

二、原因分析

  1. hutool的ListUtil#split内部用的是 list.subList;
  2. subList 执行结果是获取 ArrayList 的一部分,返回的是 ArrayList 的部分视图。对子集合的操作会反映到原集合, 对原集合的操作也会影响子集合;
  3. 说白了,你对子集合,remove数据,后面的就会顶上去;你add数据,就会加在后面。

断点分析:

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

三、注意点及解决方法

  1. 在ListUtil#split后,不要去remove或者add元素;
  2. 新建list,用新的list来处理移除或新增逻辑;
  3. 不光是hutool的ListUtil#split方法哦,其他第三方的partition、subList方法都是一个原理!!
相关推荐
万亿少女的梦1687 分钟前
基于Spring Boot的游戏交易管理系统设计与实现
java·spring boot·mysql·系统设计·交易管理
闲猫36 分钟前
Agent工程实践:从WorkFlow到多Agent协作的落地笔记
java·服务器·前端
笨蛋不要掉眼泪1 小时前
Java虚拟机:常用参数
java·开发语言·python
亦暖筑序1 小时前
AgentScope-Java 入门:用 Middleware 审计 Agent 调用
java·ai编程·agentscope
你驴我2 小时前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python
青山木2 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
小龙报2 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
自强的小白3 小时前
重点!起始时间和结束时间与创建时间和修改时间的区别(localdate与LocaldateTIME区别)以及增删改查什么时候设置目前时间(添加和更新员工时)
java
雪的季节3 小时前
Python 线程同步与异步编程 全解析
java·开发语言
吃饱了得干活3 小时前
缓存与数据库一致性:从理论到实战
java·后端·面试