Kopieren einer HashMap in Java

1. Übersicht

In diesem Tutorial werden wir das Konzept einer flachen oder tiefen Kopie einer HashMap sowie verschiedene Techniken zum Kopieren einer HashMap in Java untersuchen.

Wir werden auch einige der externen Bibliotheken betrachten, die uns in bestimmten Fällen helfen können.

2. Flache vs tiefe Kopien

Lassen Sie uns zunächst das Konzept flacher und tiefer Kopien in HashMaps verstehen .

2.1. Flache Kopie

Eine flache Kopie einer HashMap ist eine neue HashMap mit Zuordnungen zu denselben Schlüssel- und Wertobjekten wie die ursprüngliche HashMap .

Zum Beispiel erstellen wir eine Employee- Klasse und dann eine Map mit Employee- Instanzen als Werte:

public class Employee { private String name; // constructor, getters and setters } 
HashMap map = new HashMap(); Employee emp1 = new Employee("John"); Employee emp2 = new Employee("Norman"); map.put("emp1", emp1); map.put("emp2", emp2); 

Jetzt werden wir überprüfen, ob die Originalkarte und ihre flache Kopie unterschiedliche Objekte sind:

HashMap shallowCopy = // shallow copy implementation assertThat(shallowCopy).isNotSameAs(map);

Da es sich um eine flache Kopie handelt, wirkt sich das Ändern der Eigenschaften einer Employee- Instanz sowohl auf die Originalkarte als auch auf die flache Kopie aus:

emp1.setFirstName("Johny"); assertThat(shallowCopy.get("emp1")).isEqualTo(map.get("emp1"));

2.2. Tiefe Kopie

Eine tiefe Kopie einer HashMap ist eine neue HashMap , die alle Zuordnungen tief kopiert. Daher werden neue Objekte für alle Schlüssel, Werte und Zuordnungen erstellt.

Hier wirkt sich das explizite Ändern der Zuordnungen (Schlüsselwerte) nicht auf die Deep Copy aus:

HashMap deepCopy = // deep copy implementation emp1.setFirstName("Johny"); assertThat(deepCopy.get("emp1")).isNotEqualTo(map.get("emp1")); 

3. HashMap- API

3.1. Verwenden des HashMap C- Onstruktors

HashMap ‚s parametrisierte Konstruktor HashMap (Map m) bietet einen schnellen Weg zu seicht eine ganze Karte kopieren:

HashMap shallowCopy = new HashMap(originalMap); 

3.2. Verwenden von Map.clone ()

Ähnlich wie der Konstruktor erstellt auch die HashMap # -Klonmethode eine schnelle flache Kopie:

HashMap shallowCopy = originalMap.clone(); 

3.3. Verwenden von Map.put ()

Eine HashMap kann einfach flach kopiert werden, indem jeder Eintrag durchlaufen und die put () -Methode auf einer anderen Map aufgerufen wird:

HashMap shallowCopy = new HashMap(); Set
    
      entries = originalMap.entrySet(); for (Map.Entry mapEntry : entries) { shallowCopy.put(mapEntry.getKey(), mapEntry.getValue()); } 
    

3.4. Verwenden von Map.putAll ()

Anstatt alle Einträge zu durchlaufen, können wir die putAll () -Methode verwenden, mit der alle Zuordnungen in einem Schritt flach kopiert werden:

HashMap shallowCopy = new HashMap(); shallowCopy.putAll(originalMap); 

Wir sollten beachten, dass put () und putAll () die Werte ersetzen, wenn es einen passenden Schlüssel gibt .

Es ist auch interessant festzustellen, dass, wenn wir uns die Implementierung von HashMap -Konstruktor, clone () und putAll () ansehen , wir feststellen, dass alle dieselbe interne Methode zum Kopieren von Einträgen verwenden - putMapEntries () .

4. Kopieren von HashMap mit der Java 8 Stream- API

Wir können die Java 8 Stream- API verwenden, um eine flache Kopie einer HashMap zu erstellen :

Set
    
      entries = originalMap.entrySet(); HashMap shallowCopy = (HashMap) entries.stream() .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 
    

5. Google Guava

Mit Guava Maps können wir auf einfache Weise unveränderliche Karten zusammen mit der sortierten und der Bi-Karte erstellen. Um eine unveränderliche, flache Kopie dieser Karten zu erstellen, können wir die copyOf- Methode verwenden:

Map map = ImmutableMap.builder() .put("emp1",emp1) .put("emp2",emp2) .build(); Map shallowCopy = ImmutableMap.copyOf(map); assertThat(shallowCopy).isSameAs(map);

6. Apache Commons Lang

In Java sind keine Deep Copy-Implementierungen integriert. Um eine tiefe Kopie zu erstellen, können wir entweder die clone () -Methode überschreiben oder eine Serialisierungs-Deserialisierungs-Technik verwenden.

Apache Commons verfügt über SerializationUtils mit einer clone () -Methode zum Erstellen einer tiefen Kopie. Dazu muss jede Klasse, die in Deep Copy enthalten sein soll, die Serializable- Schnittstelle implementieren :

public class Employee implements Serializable { // implementation details } HashMap deepCopy = SerializationUtils.clone(originalMap);

7. Fazit

In diesem kurzen Tutorial haben wir verschiedene Techniken zum Kopieren einer HashMap in Java gesehen, zusammen mit dem Konzept der flachen und tiefen Kopie für HashMaps .

Außerdem haben wir einige der externen Bibliotheken untersucht, die für die Erstellung flacher und tiefer Kopien sehr praktisch sind.

Der vollständige Quellcode dieser Implementierungen sowie die Komponententests sind im GitHub-Projekt verfügbar.