【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 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 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 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 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数据覆盖问题是个很基础的问题,只是容易被忽视(大概)