【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重复的问题。



相关文章
|
编解码 计算机视觉
OpenCV(三十六):霍夫直线检测
OpenCV(三十六):霍夫直线检测
340 0
|
存储 SQL Java
Java8 stream 中利用 groupingBy 进行多字段分组求和
Java8 stream 中利用 groupingBy 进行多字段分组求和
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
361 3
|
安全
磁悬浮交通:超高速运输的未来
【10月更文挑战第13天】磁悬浮交通利用磁力使列车悬浮于轨道,实现高速行驶,具备速度快、安全、环保及维护简便等优势,正逐渐变革出行方式。其原理基于常导或超导磁铁产生的吸斥力,减少摩擦以提高效率。技术探索始于20世纪初,近年来在中、美、日等国取得显著进展。尽管建设成本高昂且存在技术挑战,但磁悬浮交通有望成为未来超高速运输的主力军,提升城市间交通效率。
|
消息中间件 监控 负载均衡
Kafka 最佳实践:构建可靠、高性能的分布式消息系统
Apache Kafka 是一个强大的分布式消息系统,被广泛应用于实时数据流处理和事件驱动架构。为了充分发挥 Kafka 的优势,需要遵循一些最佳实践,确保系统在高负载下稳定运行,数据可靠传递。本文将深入探讨 Kafka 的一些最佳实践,并提供丰富的示例代码,帮助大家更好地应用这一强大的消息系统。
|
API Java
解决HTTP 400 Bad Request错误的方法
解决HTTP 400 Bad Request错误的方法
7029 0
2024漂亮的个人主页源码
2024漂亮的个人主页源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
310 0
2024漂亮的个人主页源码
|
网络协议 安全 网络安全
Ngrok免费实现内网穿透
Ngrok免费实现内网穿透
1082 0
Ngrok免费实现内网穿透
|
NoSQL Java Redis
SpringBoot——实现对Redis五种数据类型的增删改查
SpringBoot——实现对Redis五种数据类型的增删改查
811 0
|
消息中间件 缓存 JavaScript
魔改xxl-job,彻底告别手动配置任务!
魔改xxl-job,彻底告别手动配置任务!