Map 中引用遇到的问题
磊磊

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("================================");

// BUG 一直都是最后一个人的姓名
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

原因

  1. 由输出可见:存进 list 的值都是最后一个的 name.
  2. 因为 list 存的都是这个 map 的同一个引用。类似于 C 语言的指针。也就是list 存的都是同一个地址,这个地址所指向的东西改变,其他存这个地址的里面的值也会改变。所以该 list 下面的值都会变,也就是 name 都是一样的。
  3. 然后 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("================================");

// 把 map 放到循环里面,避免重复引用
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

由 Hexo 驱动 & 主题 Keep
访客数 访问量