【List 对象添加与覆盖数据问题】
假设场景:需要把一个List数据 赋值给 另一个List对象,有一个字段值传递的过程:
代码1:成功赋值,无数据覆盖:
测试实体类
@Data public class mirrorDto { private String mirrorNumber; private String mirrorName; }
@Data
public class testDto {
private String number;
private String name;
}
测试代码:
@Test public void testListValue(){ List<mirrorDto> mirrorDtos = new ArrayList<>(); mirrorDto mirrorDto = new mirrorDto() ; mirrorDto.setMirrorNumber("1"); mirrorDto.setMirrorName("Tom"); mirrorDtos.add( mirrorDto); mirrorDto mirrorDto1 = new mirrorDto() ; mirrorDto1.setMirrorNumber("2"); mirrorDto1.setMirrorName("Jerry"); mirrorDtos.add(mirrorDto1); List<testDto> list = new ArrayList<>(); // 假设是通过list 赋值,模拟数据见上 for (int i = 0; i < mirrorDtos.size(); i++) { testDto dto = new testDto(); dto.setNumber((mirrorDtos.get(i).getMirrorNumber())); dto.setName(mirrorDtos.get(i).getMirrorName()); list.add(dto); } System.out.println(list); }
打印结果:[testDto(number=1, name=Tom), testDto(number=2, name=Jerry)]
代码2:数据发生覆盖:List内始终为最后一条数据内容,且list内只有一条:
for (int i = 0; i < mirrorDtos.size(); i++) { List<testDto> list = new ArrayList<>(); testDto dto = new testDto(); dto.setNumber((mirrorDtos.get(i).getMirrorNumber())); dto.setName(mirrorDtos.get(i).getMirrorName()); list.add(dto); System.out.println("打印:"+list); }
打印 当前list:
打印:[testDto(number=1, name=Tom)]
打印:[testDto(number=2, name=Jerry)]
覆盖原因:因为List声明对象如果放在循环体内就会被反复覆盖
代码3:数据发生覆盖,且当前所有内容都与最后一条数据相同:
List<testDto> list = new ArrayList<>(); testDto dto = new testDto(); // 假设是通过list 赋值,模拟数据见上 for (int i = 0; i < mirrorDtos.size(); i++) { dto.setNumber((mirrorDtos.get(i).getMirrorNumber())); dto.setName(mirrorDtos.get(i).getMirrorName()); list.add(dto); } System.out.println("打印:"+list);
打印list:
打印:[testDto(number=2, name=Jerry), testDto(number=2, name=Jerry)]
覆盖原因:实体类对象只有一个地址,每次循环实体内容都会被覆盖,最后相当于每条数据都相同(且都是最新的那条)
PS:list数据覆盖问题是个很基础的问题,只是容易被忽视(大概)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统