Kopiering af et HashMap i Java

1. Oversigt

I denne vejledning undersøger vi konceptet med en lav vs dyb kopi af en HashMap sammen med flere teknikker til at kopiere en HashMap i Java.

Vi overvejer også nogle af de eksterne biblioteker, der kan hjælpe os i specifikke tilfælde.

2. Shallow vs Deep Copies

Lad os først forstå begrebet lave og dybe kopier i HashMaps.

2.1. Lav kopi

En lav kopi af en HashMap er en ny HashMap med tilknytninger til de samme nøgle- og værdiobjekter som originalen HashMap.

For eksempel opretter vi en Medarbejder klasse og derefter et kort med Medarbejder forekomster som værdier:

offentlig klassemedarbejder {privat strengnavn; // konstruktør, getters og setters} 
HashMap-kort = nyt HashMap (); Medarbejder emp1 = ny medarbejder ("John"); Medarbejder emp2 = ny medarbejder ("Norman"); map.put ("emp1", emp1); map.put ("emp2", emp2); 

Nu skal vi kontrollere, at det originale kort og dets lave kopi er forskellige objekter:

HashMap shallowCopy = // implementering af lav kopi assertThat (shallowCopy) .isNotSameAs (kort);

Fordi dette er en lav kopi, hvis vi ændrer en Medarbejder instansens egenskaber, det påvirker både det originale kort og dets lave kopi:

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

2.2. Dyb kopi

En dyb kopi af en HashMap er en ny HashMap der kopierer dybt alle kortlægningerne dybt. Derfor opretter det nye objekter til alle nøgler, værdier og tilknytninger.

Her vil eksplicit at ændre tilknytningerne (nøgleværdier) ikke påvirke den dybe kopi:

HashMap deepCopy = // implementering af dyb kopi emp1.setFirstName ("Johny"); assertThat (deepCopy.get ("emp1")). erNotEqualTo (map.get ("emp1")); 

3. HashMap API

3.1. Bruger HashMapCinstruktør

HashMap'S parametriserede konstruktør HashMap (kort m)giver en hurtig måde at overfladisk kopiere et helt kort på:

HashMap shallowCopy = ny HashMap (originalMap); 

3.2. Ved brug af Map.clone ()

Svarende til konstruktøren, den HashMap#klon metoden skaber også en hurtig overfladisk kopi:

HashMap shallowCopy = originalMap.clone (); 

3.3. Ved brug af Map.put ()

EN HashMap kan let kopieres lavt ved at gentage det over hver post og ringe til sætte() metode på et andet kort:

HashMap shallowCopy = nyt HashMap (); Sæt poster = originalMap.entrySet (); for (Map.Entry mapEntry: poster) {shallowCopy.put (mapEntry.getKey (), mapEntry.getValue ()); } 

3.4. Ved brug af Map.putAll ()

I stedet for at gentage alle posterne kan vi bruge putAll () metode, som lavkopierer alle kortlægningerne i et trin:

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

Det skal vi bemærke sætte() og putAll () udskift værdierne, hvis der er en matchende nøgle.

Det er også interessant at bemærke, at hvis vi ser på HashMap'S konstruktør, klon ()og putAll () implementering, finder vi dem alle bruger den samme interne metode til at kopiere poster - putMapEntries ().

4. Kopiering HashMapBrug af Java 8 Strøm API

Vi kan bruge Java 8 Strøm API til at oprette en lav kopi af en HashMap:

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

5. Google Guava

Ved hjælp af Guava-kort kan vi nemt oprette uforanderlige kort sammen med det sorterede og bi-kort. For at lave en uforanderlig, lav kopi af et af disse kort kan vi bruge copyOf metode:

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

6. Apache Commons Lang

Nu har Java ikke nogen indbyggede implementeringer af dybe kopier. Så for at lave en dyb kopi kan vi enten tilsidesætte klon () metode eller bruge en serialisering-deserialiseringsteknik.

Apache Commons har SerializationUtils med en klon () metode til at oprette en dyb kopi. Til dette skal enhver klasse, der skal medtages i dyb kopi, implementere Serialiserbar grænseflade:

offentlig klasse Medarbejderimplementer Serialiserbare {// implementeringsoplysninger} HashMap deepCopy = SerializationUtils.clone (originalMap);

7. Konklusion

I denne hurtige vejledning har vi set forskellige teknikker til at kopiere en HashMap i Java sammen med begrebet overfladisk og dyb kopi til HashMaps.

Vi undersøgte også nogle af de eksterne biblioteker, der er ret praktiske til at oprette lave og dybe kopier.

Den komplette kildekode for disse implementeringer sammen med enhedstestene er tilgængelig i GitHub-projektet.