2016-06-02 8 views
1

ich diesen Code haben:java eine Karte klonen, die eine verschachtelte Karte enthält

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

Ich möchte Klon diese Karte habe ich wie folgt aus:

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

Dann:

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")); 

Ich bekomme diese Ausgabe:

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

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

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

Es ist seltsam, wenn map.get("myKey1").get("myKey2") = testValue bekommen!

Antwort

0

Als Lösung habe ich wie folgt aus:

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()); 
    } 
0

Standardmäßig führt die .clone() -Methode in Java nicht zu einer "tiefen Kopie" des Objekts, von dem Sie sie aufrufen. Es wird Ihnen nur eine neue Referenzvariable geben und die Objektreferenzen in Ihrer neuen Map werden Kopien der Referenzen in Ihrer ursprünglichen Map sein.

Es ist ziemlich ärgerlich, aber wenn Sie bestimmte Objekte in Java klonen müssen, die keine richtige Klonmethode erstellt haben, müssen Sie nur die Objektdaten durchgehen und sie in eine neue einfügen (und tiefe Kopien von Objekte wo nötig).

In diesem Fall können Sie Schleifen schreiben, die durch Ihre Map iterieren und neue Referenzen auf neue Objekte in Ihrer neuen Map einfügen.

+0

vielen Dank :) – junior

0

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

Gibt eine flache Kopie dieser HashMap Beispiel: die Schlüssel und Werte sich nicht geklont werden.

ANTWORT: Sie müssen jede Art von Sammlung durchlaufen, die Sie kopieren und einzelne Elemente kopieren möchten.

VORSCHLAG: Java unterstützt das Klonen von Objekten nicht selbst, wenn Sie eine Art von Automatisierung mit Serialisierung erstellen möchten.

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

Diese Art des Kopierens ist tief Klonen genannt.