java clone包含嵌套映射的映射

时间:2016-06-02 13:41:46

标签: java

我有这段代码:

Map<String, Map<String,String>> map = new HashMap<String, Map<String,String>> ();

我想要克隆这张地图,我确实喜欢这样:

Map<String, Map<String, String>> newMap =  (Map<String, Map<String, String>>) ((HashMap<String, Map<String,String>>) map).clone();

然后:

System.out.println(map.get("myKey1").get("myKey2"));
newMap.get("myKey1").put("myKey2","testValue"); 
System.out.println(map.get("myKey1").get("myKey2"));
System.out.println(newMap.get("myKey1").get("myKey2"));

我得到了这个输出:

map.get("myKey1").get("myKey2"):OldValue

map.get("myKey1").get("myKey2"):testValue

newMap.get("myKey1").get("myKey2"):testValue

获得map.get("myKey1").get("myKey2") = testValue时很奇怪!

3 个答案:

答案 0 :(得分:1)

https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#clone()

  

返回此HashMap实例的浅表副本:键和值   他们自己没有被克隆。

答案:您必须遍历要复制和克隆单个元素的任何类型的集合。

建议:如果您想要使用序列化来创建某种自动化,Java不支持单独克隆对象。

http://www.avajava.com/tutorials/lessons/how-do-i-perform-a-deep-clone-using-serializable.html

这种类型的复制称为深度克隆。

答案 1 :(得分:0)

在Java中默认情况下,.clone()方法实际上并没有做出深层复制&#34;您调用它的对象。它只是为您提供一个新的引用变量,新地图中的对象引用将成为原始地图中引用的副本。

这很烦人,但是如果你需要克隆某些没有制作正确克隆方法的Java对象,你需要遍历对象的数据并将其放入一个新的(并在必要时制作对象的深层副本)。

因此,在您的情况下,您可以编写遍历地图的循环,并对新对象进行新的引用以放置在新地图中。

答案 2 :(得分:0)

作为解决方案,我确实喜欢这样:

Map<String,Map<String,String>> newMap = new HashMap<String, Map<String,String>>();   
    for (Entry<String, Map<String, String>> entry : map.entrySet()) {
        newMap.put(entry.getKey(),  (Map<String, String>) ((HashMap<String, String>) map.get(entry.getKey())).clone());
    }