往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内就不会出现这种情况,这是为什么

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为可读状态,防御式编程。

因为map存放的时候 一个key 对应一个value 例如:{"test":"aaaa"}。你这里str是list,list根据下标有两个值,所以你在put方法的时候也需要循环。

img


截屏2021-09-16 下午6.28.47

第一种把map创建放在外面,你设置了两个同样的key:"test"。

第一次循环,其实{"test","ttt"}
但是第二次循环,你以为是[{“test”,"ttt"},{“test”,"aaaa"}],其实是[{“test”,"aaaa"},{“test”,"aaaa"}]
不信你打印看一下
总结:HashMap是的key是不能重复的