Soweit ich weiß, gibt es verschiedene Möglichkeiten (möglicherweise auch andere), eine flache Kopie von a Map
in Java zu erstellen :
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy;
// first way
shallowCopy = new HashMap<String, Object>(data);
// second way
shallowCopy = (Map<String, Object>) ((HashMap<String, Object>) data).clone();
Wird ein Weg dem anderen vorgezogen, und wenn ja, warum?
Eine erwähnenswerte Sache ist, dass der zweite Weg eine "Unchecked Cast" -Warnung gibt. Sie müssen also etwas hinzufügen @SuppressWarnings("unchecked")
, um es zu umgehen , was ein wenig irritierend ist (siehe unten).
@SuppressWarnings("unchecked")
public Map<String, Object> getDataAsMap() {
// return a shallow copy of the data map
return (Map<String, Object>) ((HashMap<String, Object>) data).clone();
}
java
map
clone
shallow-copy
dcp
quelle
quelle
Antworten:
Es ist immer besser, mit einem Kopierkonstruktor zu kopieren.
clone()
in Java ist kaputt (siehe SO: Wie überschreibe ich die Klonmethode richtig? ).Josh Bloch über Design - Kopierkonstruktor versus Klonen
Bloch (der übrigens das Collection-Framework entworfen und implementiert hat) ging sogar noch weiter und sagte, dass er die
clone()
Methode nur "nur weil die Leute es erwarten" bereitstellt . Er empfiehlt es überhaupt nicht.Ich denke, die interessantere Debatte ist, ob ein Kopierkonstruktor besser ist als eine Kopierfabrik, aber das ist eine ganz andere Diskussion.
quelle
Keiner der beiden: Der Konstruktor , auf den Sie sich beziehen, ist für die HashMap- Implementierung einer Map (sowie für andere) definiert, nicht jedoch für die Map-Schnittstelle selbst (betrachten Sie beispielsweise die Provider- Implementierung der Map-Schnittstelle: you wird diesen Konstruktor nicht finden).
Andererseits ist es nicht ratsam, die
clone()
von Josh Bloch erläuterte Methode zu verwenden .In Bezug auf die Kartenschnittstelle (und Ihre Frage, in der Sie fragen, wie eine Karte kopiert werden soll, nicht eine HashMap) sollten Sie Map # putAll () verwenden :
Beispiel:
quelle
Map
die ein Kopierkonstruktor vorhanden ist, gibt es keinen Grund, den Kopierkonstruktor dann nicht zu verwenden?putAll
Sie nicht wissen, ob die vonMap
Ihnen verwendete Implementierung einen Kopierkonstruktor hat oder nicht. Ein bloßer Kopierkonstruktor einerMap
Implementierung ist somit redundant.Kopieren Sie eine Karte, ohne deren Implementierung zu kennen:
quelle
<K,V>
Typparametern, um die Typensicherheit zu gewährleisten.