【BUG】循环中重复使用对象一定要注意

简介: 【BUG】循环中重复使用对象一定要注意


报错内容

报错信息显示ID重复。

原因分析

在最终添加的方法中,出现了重复ID的报错。对于为什么ID会重复,我思考了很久也没有想通。我沿着代码往上找到了saveList

int batchSize = 5000;
if (CollUtil.isNotEmpty(saveList)) {
    List<List<Map<String, Object>>> batchList = ListUtil.partition(saveList, batchSize);
    for (List<Map<String, Object>> batch : batchList) {
        if (CollUtil.isNotEmpty(batch)) {
            firstRecordMapper.insertJghzLdryList(batch.stream().filter(v -> v != null && ObjectUtil.isNotEmpty(v.get("ID"))).collect(Collectors.toList()));
        }
    }
}

代码大致如上所示。

for (Map<String, Object> item : list) {
    ...
    Map<String, Object> oneCellMap = new HashMap<String, Object>();
    // 遍历这一类型的10个二级指标,每个指标存成一行数据
    for (int i = 0; i < secIndexNameList.size(); i++) {
        ...
        oneCellMap.clear();
        oneCellMap.put("ID", IdUtilV2.getInstance().getId());
        ...
        saveList.add(oneCellMap);
        px++;
    }
    // 保存这一行数据的 综合得分
    oneCellMap.clear();
    oneCellMap.put("ID", IdUtilV2.getInstance().getId());
    ...
    saveList.add(oneCellMap);
}

我也不是很确定,但我怀疑问题出在这里,于是我做了以下修改:

for (Map<String, Object> item : list) {
    ...
    // 遍历这一类型的10个二级指标,每个指标存成一行数据
    for (int i = 0; i < secIndexNameList.size(); i++) {
        ...
        Map<String, Object> oneCellMap = new HashMap<String, Object>();
        oneCellMap.put("ID", IdUtilV2.getInstance().getId());
        ...
        saveList.add(oneCellMap);
        px++;
    }
    // 保存这一行数据的 综合得分
    Map<String, Object> oneCellMap = new HashMap<String, Object>();
    oneCellMap.put("ID", IdUtilV2.getInstance().getId());
    ...
    saveList.add(oneCellMap);
}

然后问题就解决了。我感到很奇怪,后来才反应过来...原来是使用了同一个对象。

解决方案

问题的根本原因是在循环中重复使用了同一个oneCellMap对象,导致了ID重复的问题。在第一个版本的代码中,每次循环都会清空oneCellMap对象并重新添加ID,但是由于saveList中保存的是引用,所以最终saveList中的所有oneCellMap对象的ID都是相同的。

在修改后的代码中,每次循环都创建了一个新的oneCellMap对象,确保了每个oneCellMap对象的ID都是唯一的,解决了ID重复的问题。



相关文章
|
异构计算
Magisk模块:停用HW叠加层
Magisk模块:停用HW叠加层
7183 0
Magisk模块:停用HW叠加层
|
编解码 计算机视觉
OpenCV(三十六):霍夫直线检测
OpenCV(三十六):霍夫直线检测
567 0
|
存储 SQL Java
Java8 stream 中利用 groupingBy 进行多字段分组求和
Java8 stream 中利用 groupingBy 进行多字段分组求和
|
11月前
|
存储 缓存 NoSQL
工作 10 年!Redis 内存淘汰策略 LRU 和传统 LRU 差异,还傻傻分不清
小富带你深入解析Redis内存淘汰机制:LRU与LFU算法原理、实现方式及核心区别。揭秘Redis为何采用“近似LRU”,LFU如何解决频率老化问题,并结合实际场景教你如何选择合适策略,提升缓存命中率。
1402 3
|
存储 缓存 监控
怎么更好地设计一个优秀的SaaS系统
设计一个优秀的SaaS系统,需要从架构、性能、安全性、租户隔离、扩展性等多方面进行深思熟虑。根据业务需求选择合适的多租户架构,保证数据隔离的同时提高系统性能。
1806 1
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
6071 77
|
小程序 数据挖掘 UED
餐饮店小程序开发定制桌边二维码点餐系统
随着技术不断进步,各行各业都在使用新工具来提高效率和服务质量。餐饮业也不例外。餐饮点餐小程序系统是基于微信公众平台开发的在线点餐方式。顾客可以通过手机微信扫描餐桌上的二维码,进入餐厅的点餐小程序,选择菜品、数量和口味,直接完成点餐。点餐系统会自动保存并发送给厨房,避免了传统手工点餐容易出错的问题。
|
人工智能 监控 决策智能
震惊!多角色 Agent 携手合作,竟能如此高效搞定复杂任务,背后秘密大揭晓!
在复杂任务环境中,单个智能体常因能力与资源限制而难以应对。多智能体系统(multi-agent systems)通过将任务分解并分配给各具专长的智能体,实现了高效协同工作。例如,在物流配送中,不同智能体分别处理路线规划、货物装载与交通监控,确保任务准确高效完成。同样,在大型游戏开发项目里,各智能体专注剧情设计、美术创作等特定领域,显著提升项目质量和开发速度。通过共享信息、协商决策等方式,多智能体系统展现出强大灵活性与适应性,为物流、软件开发等领域带来新机遇。
885 2
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
602 3
|
Java
SpringBoot 内部方法调用,事务不起作用的原因及解决办法
在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。
1020 4

热门文章

最新文章