复制一个 HashMap 但有两个变化
Duplicating a HashMap but having changes from twos
我正在使用复制的 HashMap,但是当我更改第二个 HashMap 的值时,第一个 HahsMap 的值也会发生变化。
这是我的代码:
HashMap<String, processing.core.PImage> firstMap = new HashMap<>();
// Filling the first HashMap with values.
System.out.println(firstMap.get("test").height); // returning 16
// Then, I duplicate the HashMap :
HashMap<String, processing.core.PImage> secondMap = new HashMap<>(firstMap);
secondMap.forEach((name, image) -> {
image.resize(1, 1);
// This sets height and width of images as 1
// BUT, logically, it must change only values from SECONDMap, not FIRSTMap
});
System.out.println(firstMap.get("test").height); // returning 1
// It returns 1 but I didn't change the values from the FIRST map ??
所以我只是不明白发生了什么以及如何解决它?
你所做的叫做Shallow Copy,它正在创建一个新的 Hash Map 指向第一个 Hash Map 的键和值,这就是为什么当一个改变了其他人感受到了变化。
你需要做的是Deep Copy,可以通过遍历第一个Hash Map,将所有的数据一个一个copy出来
HashMap<String, processing.core.PImage> secondMap = new HashMap<String, processing.core.PImage>();
for (Map.Entry<String, processing.core.PImage> entry : firstMap.entrySet())
{
secondMap.put(entry.getKey(), entry.getValue());
}
我正在使用复制的 HashMap,但是当我更改第二个 HashMap 的值时,第一个 HahsMap 的值也会发生变化。
这是我的代码:
HashMap<String, processing.core.PImage> firstMap = new HashMap<>();
// Filling the first HashMap with values.
System.out.println(firstMap.get("test").height); // returning 16
// Then, I duplicate the HashMap :
HashMap<String, processing.core.PImage> secondMap = new HashMap<>(firstMap);
secondMap.forEach((name, image) -> {
image.resize(1, 1);
// This sets height and width of images as 1
// BUT, logically, it must change only values from SECONDMap, not FIRSTMap
});
System.out.println(firstMap.get("test").height); // returning 1
// It returns 1 but I didn't change the values from the FIRST map ??
所以我只是不明白发生了什么以及如何解决它?
你所做的叫做Shallow Copy,它正在创建一个新的 Hash Map 指向第一个 Hash Map 的键和值,这就是为什么当一个改变了其他人感受到了变化。
你需要做的是Deep Copy,可以通过遍历第一个Hash Map,将所有的数据一个一个copy出来
HashMap<String, processing.core.PImage> secondMap = new HashMap<String, processing.core.PImage>();
for (Map.Entry<String, processing.core.PImage> entry : firstMap.entrySet())
{
secondMap.put(entry.getKey(), entry.getValue());
}