Kopiranje HashMap-a u Javi

1. Pregled

U ovom uputstvu istražit ćemo koncept plitke ili duboke kopije a HashMap zajedno s nekoliko tehnika kopiranja a HashMap na Javi.

Također ćemo razmotriti neke vanjske knjižnice koje nam mogu pomoći u određenim slučajevima.

2. Plitke vs duboke kopije

Prvo, shvatimo pojam plitkih i dubokih kopija u HashMaps.

2.1. Plitka kopija

Plitka kopija a HashMap je novo HashMap s preslikavanjima na isti objekt ključa i vrijednosti kao izvornik HashMap.

Na primjer, stvorit ćemo Zaposlenik razreda, a zatim karta sa Zaposlenik primjerci kao vrijednosti:

zaposlenik u javnoj klasi {private String name; // konstruktor, getteri i postavljači} 
Karta HashMap = nova HashMap (); Zaposlenik emp1 = novi zaposlenik ("John"); Zaposlenik emp2 = novi zaposlenik ("Norman"); map.put ("emp1", emp1); map.put ("emp2", emp2); 

Sada ćemo provjeriti jesu li izvorna karta i njezina plitka kopija različiti objekti:

HashMap shallowCopy = // implementacija plitke kopije assertThat (shallowCopy) .isNotSameAs (map);

Jer ovo je plitka kopija, ako promijenimo Zaposlenik svojstva instance, to će utjecati na izvornu kartu i njenu plitku kopiju:

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

2.2. Duboka kopija

Dubinska kopija a HashMap je novo HashMap koja duboko kopira sva preslikavanja. Stoga stvara nove objekte za sve ključeve, vrijednosti i preslikavanja.

Ovdje izričita izmjena preslikavanja (ključ / vrijednost) neće utjecati na dubinsku kopiju:

HashMap deepCopy = // implementacija dubinske kopije emp1.setFirstName ("Johny"); assertThat (deepCopy.get ("emp1")). isNotEqualTo (map.get ("emp1")); 

3. HashMap API

3.1. Koristiti HashMapConstruktor

HashMap'S parametarski konstruktor HashMap (karta m)pruža brz način plitkog kopiranja cijele karte:

HashMap shallowCopy = novi HashMap (originalMap); 

3.2. Koristeći Map.clone ()

Slično konstruktoru, HashMap#klon metoda također stvara brzu plitku kopiju:

HashMap shallowCopy = originalMap.clone (); 

3.3. Koristeći Map.put ()

A HashMap lako se mogu plitko kopirati ponavljanjem preko svakog unosa i pozivanjem staviti() metoda na drugoj karti:

HashMap shallowCopy = novi HashMap (); Postavi unosi = originalMap.entrySet (); za (Map.Entry mapEntry: unosi) {shallowCopy.put (mapEntry.getKey (), mapEntry.getValue ()); } 

3.4. Koristeći Map.putAll ()

Umjesto da ponavljamo sve unose, možemo koristiti putAll () metoda koja plitko kopira sva preslikavanja u jednom koraku:

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

To bismo trebali primijetiti staviti() i putAll () zamijenite vrijednosti ako postoji odgovarajući ključ.

Također je zanimljivo primijetiti da, ako pogledamo HashMapKonstruktor, klon(), i putAll () implementacije, naći ćemo da svi koriste istu internu metodu za kopiranje unosa - putMapEntries ().

4. Kopiranje HashMapKorištenje Jave 8 Stream API

Možemo koristiti Javu 8 Stream API za stvaranje plitke kopije a HashMap:

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

5. Google Guava

Korištenjem Guava Maps možemo lako stvoriti nepromjenjive karte, zajedno sa razvrstanom i bi mapom. Da bismo napravili nepromjenjivu, plitku kopiju bilo koje od ovih karata, možemo koristiti kopija od metoda:

Mapa karte = ImmutableMap.builder () .put ("emp1", emp1) .put ("emp2", emp2) .build (); Karta shallowCopy = ImmutableMap.copyOf (karta); assertThat (shallowCopy) .isSameAs (karta);

6. Apache Commons Lang

Sada Java nema ugrađene implementacije dubokog kopiranja. Da bismo napravili dubinsku kopiju, ili možemo nadjačati klon() metodu ili upotrijebite tehniku ​​serializacije-deserializacije.

Apache Commons ima Korištenje serializacije s klon() metoda za stvaranje dubinske kopije. U tu svrhu bilo koja klasa koja se uključuje u dubinsku kopiju mora implementirati Serijalizirati sučelje:

javna klasa Zaposlenik implementira Serializable {// detalji implementacije} HashMap deepCopy = SerializationUtils.clone (originalMap);

7. Zaključak

U ovom smo brzom vodiču vidjeli razne tehnike kopiranja a HashMap na Javi, zajedno s konceptom plitke i duboke kopije za HashMaps.

Također, istražili smo neke vanjske knjižnice koje su vrlo korisne za stvaranje plitkih i dubokih kopija.

Kompletni izvorni kod ovih implementacija, zajedno s jediničnim testovima, dostupan je u projektu GitHub.


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