Map 中引用遇到的问题
场景:
1 2 3
   | 1、有 List<String> nameList 值为『张三,李四,王五』 2、把 nameList 的每个值都存到 key 为"name" 的 map<String,Object> 中 3、并把 map 放到 List<Map<String, Object>> 里面
   | 
 
等于说是:
『张三,李四,王五』==> 『{name= 张三}, {name= 李四}, {name= 王五}』
BUG
BUG : 一直都是最后一个人的姓名
 
BUG 代码:
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | public static void main(String[PANGU_DISABLE] args) {     List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五"));     System.out.println(nameList);     System.out.println("================================");
           List<Map<String, Object>> list = new ArrayList<>();     Map<String, Object> map = new HashMap<>(16);     for (String name : nameList) {         map.put("name", name);         list.add(map);         System.out.println(list);     } }
  | 
 
![image]()
原因
- 由输出可见:存进 list 的值都是最后一个的 name.
 
- 因为 list 存的都是这个 map 的同一个引用。类似于 C 语言的指针。也就是list  存的都是同一个地址,这个地址所指向的东西改变,其他存这个地址的里面的值也会改变。所以该 list 下面的值都会变,也就是 name 都是一样的。
 
- 然后 map 的 put 有去重的效果,以最后一个 key 所 put 进去的值为准。所以存的是最后一个 name.
 
解决
- 由原因的第 2 点,我们只需不让 list 存同一个地址。即让 map 重新指向新的地址。即重新 new 一个 HashMap.
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | public static void main(String[] args) {     List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", "王五"));     System.out.println(nameList);     System.out.println("================================");
           List<Map<String, Object>> list = new ArrayList<>();     for (String name : nameList) {         Map<String, Object> map = new HashMap<>(16);         map.put("name", name);         list.add(map);         System.out.println(list);     } }
  | 
 
![image]()