代码
public static void main(String[] args) {
test test = new test();
test.bugOne();
}
private void bugOne() {
List<Map<String, Object>> list = new ArrayList<>();
HashMap<String, Object> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
list.add(map);
System.out.println(list);
for (int i = 0; i < 2; i++) {
map.put("1", "11" + i);
map.put("2", "22" + i);
map.put("3", "33" + i);
map.put("4", "44" + i);
list.add(map);
}
System.out.println(list);
}
结果
原因
在 Java 中,如果将相同的 Map 对象多次添加到 Lis t集合中,则在 List 集合中存储的 Map 对象实际上是同一个对象。
这是因为在 Java 中,通过变量和集合中保存的是对象的引用,而不是对象本身的拷贝。
当使用相同的对象作为参数多次调用方法时,实际上是多次使用了同一个对象。
因此,如果更改其中一个 Map 对象的值,所有在 List 集合中存储的 Map 对象都将反映这些更改,因为它们实际上是同一个对象。
解决
重新 New 一个新的 Map 对象用来存储数据
public static void main(String[] args) {
test test = new test();
test.bugOne();
}
private void bugOne() {
List<Map<String, Object>> list = new ArrayList<>();
HashMap<String, Object> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
list.add(map);
System.out.println(list);
// for (int i = 0; i < 2; i++) {
// map.put("1", "11" + i);
// map.put("2", "22" + i);
// map.put("3", "33" + i);
// map.put("4", "44" + i);
// list.add(map);
// }
for (int i = 0; i < 2; i++) {
Map<String, Object> iMap = new HashMap<>();
iMap.put("1", "11" + i);
iMap.put("2", "22" + i);
iMap.put("3", "33" + i);
iMap.put("4", "44" + i);
list.add(iMap);
}
System.out.println(list);
}