首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

有时候博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top

首发博客地址[1]

文章更新计划[2]

系列文章地址[3]

报错内容

报错信息显示ID重复。

原因分析

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

int batchSize = 5000;

if (CollUtil.isNotEmpty(saveList)) {

List batchList = ListUtil.partition(saveList, batchSize);

for (List batch : batchList) {

if (CollUtil.isNotEmpty(batch)) {

firstRecordMapper.insertJghzLdryList(batch.stream().filter(v -> v != null && ObjectUtil.isNotEmpty(v.get("ID"))).collect(Collectors.toList()));

}

}

}

代码大致如上所示。

for (Map item : list) {

...

Map oneCellMap = new HashMap();

// 遍历这一类型的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 item : list) {

...

// 遍历这一类型的10个二级指标,每个指标存成一行数据

for (int i = 0; i < secIndexNameList.size(); i++) {

...

Map oneCellMap = new HashMap();

oneCellMap.put("ID", IdUtilV2.getInstance().getId());

...

saveList.add(oneCellMap);

px++;

}

// 保存这一行数据的 综合得分

Map oneCellMap = new HashMap();

oneCellMap.put("ID", IdUtilV2.getInstance().getId());

...

saveList.add(oneCellMap);

}

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

解决方案

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

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

参考资料

[1]

首发博客地址: https://blog.zysicyj.top/

[2]

文章更新计划: https://blog.zysicyj.top/update_plan/

[3]

系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/RocketMq/

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OTT0SQlKbkwTMdqNGsUKgljQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券