如何在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()); }
我检查了有关堆栈溢出的所有相关问题,并尝试了上述可能的方法。当我使用上述任何一种方法时,都不会创建新实例。当我改变targetMap时,inputMap也会改变 任何帮助都将不胜感激。提前感谢:)您将更改地图与更改地图中的对象混为一谈 首先:我很少需要这样做。像任何称为如何在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中的类需要支持它们自己的
模型
的复杂对象一样,很少需要复制。最好直接传递映射,或者编写一个能够更好地控制如何访问或修改其数据的包装器类
您需要一个深度副本,这意味着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);