宁武皇仁光九年锦文轩刻本《异闻录》载: 扶桑画师浅溪,居泰安,喜绘鲤。院前一方荷塘,锦鲤游曳,溪常与嬉戏。 其时正武德之乱,潘镇割据,战事频仍,魑魅魍魉,肆逆于道。兵戈逼泰安,街邻皆逃亡,独溪不舍锦鲤,未去。 是夜,院室倏火。有人入火护溪,言其本鲤中妖,欲取溪命,却生情愫,遂不忍为之。翌日天明,火势渐歇,人已不见。 溪始觉如梦,奔塘边,但见池水干涸,莲叶皆枯,塘中鲤亦不知所踪。 自始至终,未辨眉目,只记襟上层迭莲华,其色魅惑,似血着泪。 后有青岩居士闻之,叹曰:魑祟动情,必作灰飞。犹蛾之投火耳,非愚,乃命数也。 ————《锦鲤抄》

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

 

posted @   哒布溜  阅读(722)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示