我有这段代码:
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
时很奇怪!
答案 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());
}