Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中克隆或创建地图的新副本 Map temp=新的ConcurrentHashMap(inputMap); temp.keySet().removeAll(targetMap.keySet()); targetMap.putAll(温度); targetMap=新的ConcurrentHashMap(inputMap); targetMap.putAll(inputMap); forEach(targetMap::putIfAbsent); 对于(Map.Entry:inputMap.entrySet()){ put(entry.getKey(),entry.getValue()); }_Java_Dictionary_Hashmap_Deep Copy - Fatal编程技术网

如何在java中克隆或创建地图的新副本 Map temp=新的ConcurrentHashMap(inputMap); temp.keySet().removeAll(targetMap.keySet()); targetMap.putAll(温度); targetMap=新的ConcurrentHashMap(inputMap); targetMap.putAll(inputMap); forEach(targetMap::putIfAbsent); 对于(Map.Entry:inputMap.entrySet()){ put(entry.getKey(),entry.getValue()); }

如何在java中克隆或创建地图的新副本 Map temp=新的ConcurrentHashMap(inputMap); temp.keySet().removeAll(targetMap.keySet()); targetMap.putAll(温度); targetMap=新的ConcurrentHashMap(inputMap); targetMap.putAll(inputMap); forEach(targetMap::putIfAbsent); 对于(Map.Entry:inputMap.entrySet()){ put(entry.getKey(),entry.getValue()); },java,dictionary,hashmap,deep-copy,Java,Dictionary,Hashmap,Deep Copy,我检查了有关堆栈溢出的所有相关问题,并尝试了上述可能的方法。当我使用上述任何一种方法时,都不会创建新实例。当我改变targetMap时,inputMap也会改变 任何帮助都将不胜感激。提前感谢:)您将更改地图与更改地图中的对象混为一谈 首先:我很少需要这样做。像任何称为模型的复杂对象一样,很少需要复制。最好直接传递映射,或者编写一个能够更好地控制如何访问或修改其数据的包装器类 您需要一个深度副本,这意味着map-String和WriteToFileColumnsModel中的类需要支持它们自己的

我检查了有关堆栈溢出的所有相关问题,并尝试了上述可能的方法。当我使用上述任何一种方法时,都不会创建新实例。当我改变targetMap时,inputMap也会改变

任何帮助都将不胜感激。提前感谢:)

您将更改地图与更改地图中的对象混为一谈

首先:我很少需要这样做。像任何称为
模型
的复杂对象一样,很少需要复制。最好直接传递映射,或者编写一个能够更好地控制如何访问或修改其数据的包装器类

您需要一个深度副本,这意味着map-
String
WriteToFileColumnsModel
中的类需要支持它们自己的克隆操作。实际上,这是一个半谎言-
字符串
是不可变的,所以使用浅拷贝是可以的,因为它无论如何都不会改变

作为一个简单的例子,考虑一个类

Map<String, WriteToFileColumnsModel> temp = new ConcurrentHashMap<>(inputMap);
temp.keySet().removeAll(targetMap.keySet());
targetMap.putAll(temp);

targetMap = new ConcurrentHashMap<>(inputMap);

targetMap.putAll(inputMap);

inputMap.forEach(targetMap::putIfAbsent);

for (Map.Entry<String, WriteToFileColumnsModel> entry : inputMap.entrySet()) {
        targetMap.put(entry.getKey(), entry.getValue());
}

还有另一个

people.get(0).name = "Sue";
这就是您的副本中存在的问题

假设支持,则需要分别复制每个
WriteToFileColumnsModel
。您可能必须为地图中的每个项目手动执行此操作(或者使用一些Java 8废话)。

您将更改地图与更改地图中的对象混淆了

首先:我很少需要这样做。像任何称为
模型
的复杂对象一样,很少需要复制。最好直接传递映射,或者编写一个能够更好地控制如何访问或修改其数据的包装器类

您需要一个深度副本,这意味着map-
String
WriteToFileColumnsModel
中的类需要支持它们自己的克隆操作。实际上,这是一个半谎言-
字符串
是不可变的,所以使用浅拷贝是可以的,因为它无论如何都不会改变

作为一个简单的例子,考虑一个类

Map<String, WriteToFileColumnsModel> temp = new ConcurrentHashMap<>(inputMap);
temp.keySet().removeAll(targetMap.keySet());
targetMap.putAll(temp);

targetMap = new ConcurrentHashMap<>(inputMap);

targetMap.putAll(inputMap);

inputMap.forEach(targetMap::putIfAbsent);

for (Map.Entry<String, WriteToFileColumnsModel> entry : inputMap.entrySet()) {
        targetMap.put(entry.getKey(), entry.getValue());
}

还有另一个

people.get(0).name = "Sue";
这就是您的副本中存在的问题


假设支持,则需要分别复制每个
WriteToFileColumnsModel
。您可能需要为地图中的每个项目手动执行此操作(或者使用一些Java 8废话)。

对我来说,您的大多数解决方案都应该可以工作。然而,我认为最直接的方法是:

System.out.println(otherPeople.get(0).name); // prints "Sue"
Map targetMap=新的ConcurrentHashMap(inputMap);

我认为还有另一个问题:您正在更改作为值存储在地图中的对象。由于两个贴图都指向相同的对象,因此可以同时更改两个贴图的值对象。

对我来说,大多数解决方案都应该有效。然而,我认为最直接的方法是:

System.out.println(otherPeople.get(0).name); // prints "Sue"
Map targetMap=新的ConcurrentHashMap(inputMap);

我认为还有另一个问题:您正在更改作为值存储在地图中的对象。由于两个映射指向相同的对象,因此您可以同时更改两个映射的值对象。

我不明白您想做什么。我正在尝试从现有映射创建具有相同键值对的新映射。但是当我修改新地图时,现有地图不应该被修改。直截了当地说出你的术语——当你创建一个新地图,然后添加所有(sourceMap),你就有了一个新地图。这不可能不起作用(正如你所说的)。可能发生的情况是更改地图中的对象,这些对象当然是复制的地图中的相同对象。如果你想复制地图中的对象,你必须自己为每个对象制作副本。那么你的意思是这些值与现有地图的实例相同?你是对的。我在修改新地图中的值,然后你需要一种方法来复制每个对象。根据WriteToFileColumnModel实现的不同,这可能从简单到几乎不可能。该过程称为深度克隆。我不明白您试图做什么。我正在尝试使用现有映射中的相同键值对创建一个新映射。但是当我修改新地图时,现有地图不应该被修改。直截了当地说出你的术语——当你创建一个新地图,然后添加所有(sourceMap),你就有了一个新地图。这不可能不起作用(正如你所说的)。可能发生的情况是更改地图中的对象,这些对象当然是复制的地图中的相同对象。如果你想复制地图中的对象,你必须自己为每个对象制作副本。那么你的意思是这些值与现有地图的实例相同?你是对的。我在修改新地图中的值,然后你需要一种方法来复制每个对象。根据WriteToFileColumnModel实现的不同,这可能从简单到几乎不可能。这个过程被称为深度克隆。为什么要投否决票?我解释了和投票结果相同的问题。谢谢你的回答。。虽然这个答案需要一点详细说明,但没有理由不说明原因就投反对票。我最近注意到,这么低的票数毫无意义。想知道我为什么在这里浪费这么多时间…为什么投反对票?我解释了和投票结果相同的问题。谢谢你的回答。。虽然这个答案需要一点详细说明,但没有理由不说明原因就投反对票。我最近注意到,这么低的票数毫无意义。我想知道为什么我在这里浪费了这么多时间……非常好:)非常感谢,但是创建一个新的对象实例很痛苦:)非常好:)非常感谢,但是创建它很痛苦
Map<String, WriteToFileColumnsModel> targetMap = new ConcurrentHashMap<>(inputMap);