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.