Kopírovanie HashMap v Jave

1. Prehľad

V tomto výučbe sa pozrieme na koncepciu plytkej a hlbokej kópie súboru HashMap spolu s niekoľkými technikami kopírovania a HashMap v Jave.

Zvážime tiež niektoré externé knižnice, ktoré nám môžu v konkrétnych prípadoch pomôcť.

2. Plytké vs hlboké kópie

Po prvé, poďme pochopiť koncept plytkých a hlbokých kópií v HashMaps.

2.1. Plytké kopírovanie

Plytká kópia a HashMap je nový HashMap s mapovaním na rovnaké kľúčové a hodnotové objekty ako originál HashMap.

Napríklad vytvoríme Zamestnanec triedy a potom mapa s Zamestnanec inštancie ako hodnoty:

public class Employee {private String name; // konštruktor, getri a nastavovatelia} 
Mapa HashMap = nová HashMap (); Zamestnanec emp1 = nový zamestnanec („John“); Zamestnanec emp2 = nový zamestnanec („Norman“); map.put ("emp1", emp1); map.put ("emp2", emp2); 

Teraz overíme, že pôvodná mapa a jej plytká kópia sú odlišné objekty:

HashMap shallowCopy = // implementácia plytkej kópie assertThat (shallowCopy) .isNotSameAs (mapa);

Pretože toto je plytká kópia, ak zmeníme Zamestnanec vlastnosti inštancie, ovplyvní pôvodnú mapu aj jej plytkú kópiu:

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

2.2. Deep Copy

Hlboká kópia a HashMap je nový HashMap ktorý hlboko kopíruje všetky mapovania. Preto vytvára nové objekty pre všetky kľúče, hodnoty a mapovania.

Tu explicitná úprava priradení (párov kľúč - hodnota) nebude mať vplyv na hĺbkovú kópiu:

HashMap deepCopy = // implementácia hlbokých kópií emp1.setFirstName ("Johny"); assertThat (deepCopy.get ("emp1")). isNotEqualTo (map.get ("emp1")); 

3. HashMap API

3.1. Pomocou HashMapC.inštruktor

HashMapParametrizovaný konštruktor HashMap (mapa m)poskytuje rýchly spôsob plytkého kopírovania celej mapy:

HashMap shallowCopy = nový HashMap (originalMap); 

3.2. Použitím Map.clone ()

Podobne ako konštruktér, aj HashMap#klon metóda tiež vytvorí rýchlu plytkú kópiu:

HashMap shallowCopy = originalMap.clone (); 

3.3. Použitím Map.put ()

A HashMap možno ľahko kopírovať plytko opakovaním každého záznamu a volaním súboru put () metóda na inej mape:

HashMap shallowCopy = nový HashMap (); Nastaviť entries = originalMap.entrySet (); pre (Map.Entry mapEntry: entries) {shallowCopy.put (mapEntry.getKey (), mapEntry.getValue ()); } 

3.4. Použitím Map.putAll ()

Namiesto opakovania všetkých položiek môžeme použiť znak putAll () metóda, ktorá plytko kopíruje všetky mapovania v jednom kroku:

HashMap shallowCopy = nový HashMap (); shallowCopy.putAll (originalMap); 

Mali by sme si to všimnúť put () a putAll () nahraďte hodnoty, ak existuje zodpovedajúci kľúč.

Je tiež zaujímavé poznamenať, že keď sa pozrieme na HashMapKonštruktér, klon ()a putAll () implementácie, nájdeme všetky, ktoré používajú rovnakú internú metódu na kopírovanie záznamov - putMapEntries ().

4. Kopírovanie HashMapPoužívanie Java 8 Prúd API

Môžeme použiť Java 8 Prúd API na vytvorenie plytkej kópie súboru HashMap:

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

5. Google Guava

Pomocou máp Guava môžeme ľahko vytvárať nemenné mapy spolu s triedenou a bi mapou. Na vytvorenie nemennej plytkej kópie ktorejkoľvek z týchto máp môžeme použiť kópia metóda:

Mapa mapy = ImmutableMap.builder () .put ("emp1", emp1) .put ("emp2", emp2) .build (); Mapa shallowCopy = ImmutableMap.copyOf (mapa); assertThat (shallowCopy) .isSameAs (mapa);

6. Apache Commons Lang

Java teraz nemá žiadne zabudované implementácie hlbokých kópií. Takže aby sme vytvorili hlbokú kópiu, buď môžeme prepísať klon () metóda alebo použiť techniku ​​serializácie-deserializácie.

Apache Commons má SerializationUtils s klon () metóda na vytvorenie hlbokej kópie. Za týmto účelom musí každá trieda, ktorá má byť zahrnutá do hlbokej kópie, implementovať Serializovateľné rozhranie:

verejná trieda Zamestnanec implementuje Serializable {// podrobnosti implementácie} HashMap deepCopy = SerializationUtils.clone (originalMap);

7. Záver

V tomto rýchlom výučbe sme videli rôzne techniky kopírovania súboru HashMap v Jave, spolu s konceptom plytkej a hlbokej kópie pre HashMaps.

Preskúmali sme tiež niektoré externé knižnice, ktoré sú celkom užitočné na vytváranie plytkých a hlbokých kópií.

Kompletný zdrojový kód týchto implementácií spolu s testami jednotiek sú k dispozícii v projekte GitHub.


$config[zx-auto] not found$config[zx-overlay] not found