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]()