Een HashMap kopiëren in Java

1. Overzicht

In deze tutorial onderzoeken we het concept van een ondiepe versus diepe kopie van een Hash kaart samen met verschillende technieken om een Hash kaart in Java.

We zullen ook enkele van de externe bibliotheken bekijken die ons in specifieke gevallen kunnen helpen.

2. Ondiepe versus diepe kopieën

Laten we eerst het concept van ondiepe en diepe kopieën in HashMaps.

2.1. Oppervlakkige kopie

Een ondiepe kopie van een Hash kaart is een nieuw Hash kaart met toewijzingen aan dezelfde sleutel- en waardeobjecten als het origineel Hash kaart.

We maken bijvoorbeeld een Werknemer klasse en dan een kaart met Werknemer instanties als waarden:

openbare klasse Werknemer {privé Stringnaam; // constructeur, getters en setters} 
HashMap-kaart = nieuwe HashMap (); Werknemer emp1 = nieuwe werknemer ("Jan"); Werknemer emp2 = nieuwe werknemer ("Norman"); map.put ("emp1", emp1); map.put ("emp2", emp2); 

Nu zullen we controleren of de originele kaart en de ondiepe kopie ervan verschillende objecten zijn:

HashMap shallowCopy = // ondiepe kopie-implementatie assertThat (shallowCopy) .isNotSameAs (map);

Omdat dit een ondiepe kopie is, als we een Werknemer de eigenschappen van de instantie, heeft dit invloed op zowel de originele kaart als de ondiepe kopie ervan:

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

2.2. Diepe kopie

Een diepe kopie van een Hash kaart is een nieuw Hash kaart dat alle toewijzingen diep kopieert. Daarom maakt het nieuwe objecten voor alle sleutels, waarden en toewijzingen.

Hier heeft het expliciet wijzigen van de toewijzingen (sleutel / waarden) geen invloed op de diepe kopie:

HashMap deepCopy = // implementatie van diepe kopie emp1.setFirstName ("Johny"); assertThat (deepCopy.get ("emp1")). isNotEqualTo (map.get ("emp1")); 

3. Hash kaart API

3.1. De ... gebruiken Hash kaartConstructor

Hash kaart‘S geparametriseerde constructor HashMap (Kaart m)biedt een snelle manier om een ​​volledige kaart ondiep te kopiëren:

HashMap shallowCopy = nieuwe HashMap (originalMap); 

3.2. Gebruik makend van Map.clone ()

Net als bij de constructor, de Hash kaart#kloon methode maakt ook een snelle ondiepe kopie:

HashMap shallowCopy = originalMap.clone (); 

3.3. Gebruik makend van Map.put ()

EEN Hash kaart kan gemakkelijk oppervlakkig worden gekopieerd door elke invoer te herhalen en de leggen() methode op een andere kaart:

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

3.4. Gebruik makend van Map.putAll ()

In plaats van alle items te herhalen, kunnen we de zet alle() methode, die alle toewijzingen in één stap ondiep kopieert:

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

Dat moeten we opmerken leggen() en zet alle() vervang de waarden als er een overeenkomende sleutel is.

Het is ook interessant om op te merken dat, als we naar de Hash kaart‘S constructeur, kloon (), en zet alle() implementatie, we zullen zien dat ze allemaal dezelfde interne methode gebruiken om vermeldingen te kopiëren - putMapEntries ().

4. Kopiëren Hash kaartMet behulp van de Java 8 Stroom API

We kunnen de Java 8 gebruiken Stroom API om een ​​ondiepe kopie van een Hash kaart:

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

5. Google Guava

Met behulp van Guava-kaarten kunnen we eenvoudig onveranderlijke kaarten maken, samen met de gesorteerde en bi-kaart. Om een ​​onveranderlijke, ondiepe kopie van een van deze kaarten te maken, kunnen we de kopie van methode:

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

6. Apache Commons Lang

Nu heeft Java geen ingebouwde deep copy-implementaties. Dus om een ​​diepe kopie te maken, kunnen we ofwel de kloon () methode of gebruik een serialisering-deserialisatietechniek.

Apache Commons heeft SerializationUtils met een kloon () methode om een ​​diepe kopie te maken. Hiervoor moet elke klasse die in een diepe kopie moet worden opgenomen, de extensie Serialiseerbaar koppel:

public class Medewerker implementeert Serializable {// implementatie details} HashMap deepCopy = SerializationUtils.clone (originalMap);

7. Conclusie

In deze korte tutorial hebben we verschillende technieken gezien om een Hash kaart in Java, samen met het concept van ondiepe en diepe kopie voor Hash kaarts.

We hebben ook enkele van de externe bibliotheken onderzocht die erg handig zijn voor het maken van ondiepe en diepe kopieën.

De volledige broncode van deze implementaties samen met de unit tests zijn beschikbaar in het GitHub-project.