【SNAIL】CONNER 2021-09-16 18:14 采纳率: 50%
浏览 63
已结题

往list中存放Map集合


        List<String> list = new ArrayList<>();
       list.add("ttt");
       list.add("aaaa");
       Map<String, String> map = new HashMap<>();
       List<Map<String, String>> result = new ArrayList<>();
       for(String str : list){
           map.put("test", str);
           result.add(map);
       }
        System.out.println(JSON.toJSONString(result));

结果:[{"test":"aaaa"},{"$ref":"$[0]"}]

将map的创建防止for循环外边就会出现 {"$ref":"$[0]"}这种情况,放到for内就不会出现这种情况,这是为什么

  • 写回答

3条回答 默认 最新

  • 山河已无恙 云原生领域优质创作者 2021-09-16 19:12
    关注

    img


    • 嗯,感觉是那个JSON工具包的问题,可能处理上有问题,关于这个你可以百度
    • JSON异常的的原因的话:代码的话,你的List里放了两个map,实际你只放了一个map,你声明的一个引用地址,对应内存里一个堆,但是你的for用了多次,所以你在list里add多次次也都是那一个堆,所以内容是一样的
    • 一般情况下,放到list的对象不会修改,因为存到list里的是地址,修改的话会直接修改list的数据,list就不能保证你放进去的和你拿出来的相同,并发修改,这属于一种list污染,这个和java堆污染有些类似,但是不一样。
    • 对于存在list 的数据会改变的问题,这个java好像没有提供类似的机制,放map的话,这个粒度太细了,但是java提供了设置list为只读状态的方法,Collections.unmodifiableList(),是一种粗粒度的防止list被破坏的方式,设置之后你的list就不能随便添加删除。会报UnsupportedOperationException异常
    • 当然Collections.unmodifiableList()存在的意义,因为java对与一些list中生成子list视图的方法进行了保护,比如subList,生成子list修改原list就会报 并发修改的异常ConcurrentModificationException,所以需要设置lise为可读状态,防御式编程。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日
  • 创建了问题 9月16日

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法