HashMap másolása Java-ban

1. Áttekintés

Ebben az oktatóanyagban feltárjuk az a HashMap számos másolási technikával együtt a HashMap Java-ban.

Figyelembe veszünk néhány olyan külső könyvtárat is, amelyek konkrét esetekben segítségünkre lehetnek.

2. Sekély vs mély másolatok

Először is, értsük meg a sekély és mély másolatok fogalmát HashMaps.

2.1. Sekély másolat

A. Sekély példánya HashMap egy új HashMap az eredetivel megegyező kulcs és érték objektumok leképezésével HashMap.

Például létrehozunk egy Munkavállaló osztály, majd egy térkép a -val Munkavállaló példányok értékként:

public class Alkalmazott {private String név; // kivitelező, mérőeszközök és beállítók} 
HashMap térkép = új HashMap (); Employee emp1 = új alkalmazott ("John"); Employee emp2 = új alkalmazott ("Norman"); map.put ("emp1", emp1); map.put ("emp2", emp2); 

Most ellenőrizni fogjuk, hogy az eredeti térkép és annak sekély másolata különböző objektumok:

HashMap shallowCopy = // sekély példányú implementáció assertThat (shallowCopy) .isNotSameAs (térkép);

Mivel ez egy sekély másolat, ha egy Munkavállaló példány tulajdonságai, mind az eredeti térképre, mind annak sekély példányára hatással lesz:

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

2.2. Mély másolat

Egy mély másolat a HashMap egy új HashMap amely mélyen lemásolja az összes leképezést. Ezért új objektumokat hoz létre az összes kulcshoz, értékhez és hozzárendeléshez.

Itt a leképezések (kulcsértékek) kifejezett módosítása nem befolyásolja a mély másolatot:

HashMap deepCopy = // mély másolat megvalósítása emp1.setFirstName ("Johny"); assertThat (deepCopy.get ("emp1")). isNotEqualTo (map.get ("emp1")); 

3. HashMap API

3.1. Használni a HashMapConstructor

HashMapParaméterezett konstruktor HashMap (Térkép m)gyors módot kínál a teljes térkép sekély másolására:

HashMap shallowCopy = új HashMap (originalMap); 

3.2. Használata Map.clone ()

A kivitelezőhöz hasonlóan a HashMap#klón A módszer egy gyors, sekély másolatot is létrehoz:

HashMap shallowCopy = originalMap.clone (); 

3.3. Használata Map.put ()

A HashMap könnyen sekélyen lemásolható minden bejegyzés ismétlésével és a put () módszer egy másik térképen:

HashMap shallowCopy = új HashMap (); Készlet bejegyzések = originalMap.entrySet (); for (Map.Entry mapEntry: bejegyzések) {shallowCopy.put (mapEntry.getKey (), mapEntry.getValue ()); } 

3.4. Használata Map.putAll ()

Ahelyett, hogy az összes bejegyzést iterálnánk, használhatjuk a putAll () módszer, amely az összes leképezést sekélyen lemásolja egy lépésben:

HashMap shallowCopy = új HashMap (); shallowCopy.putAll (originalMap); 

Meg kell jegyeznünk put () és putAll () cserélje ki az értékeket, ha van egyező kulcs.

Érdekes megjegyezni azt is, hogy ha megnézzük a HashMapKonstruktor, klón (), és putAll () Megtaláljuk, hogy mindegyikük ugyanazt a belső módszert használja a bejegyzések másolásához - putMapEntries ().

4. Másolás HashMapA Java 8 használata Folyam API

Használhatjuk a Java 8-at Folyam API az a HashMap:

Készlet bejegyzések = originalMap.entrySet (); HashMap shallowCopy = (HashMap) bejegyzések.stream () .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue)); 

5. Google Guava

A Guava Maps használatával könnyen létrehozhatunk változhatatlan térképeket, a rendezett és bi térképekkel együtt. Ezen térképek megváltoztathatatlan, sekély másolatának elkészítéséhez használhatjuk a másolata módszer:

Térképtérkép = ImmutableMap.builder () .put ("emp1", emp1) .put ("emp2", emp2) .build (); Map shallowCopy = ImmutableMap.copyOf (térkép); assertThat (shallowCopy) .isSameAs (térkép);

6. Apache Commons Lang

Most a Java nem rendelkezik beépített mély másolású megvalósításokkal. Tehát egy mély másolat készítéséhez felülírhatjuk a klón () módszerrel, vagy használjon szerializációs-deserializációs technikát.

Az Apache Commons-nak van SerializationUtils val,-vel klón () módszer egy mély másolat létrehozására. Ehhez bármelyik mélyrétegű osztályba be kell sorolni a Sorosítható felület:

public class Employee implementálja a Serializable {// implementáció részletei} HashMap deepCopy = SerializationUtils.clone (originalMap);

7. Következtetés

Ebben a gyors bemutatóban különböző technikákat láthattunk a HashMap Java-ban, a sekély és mély másolat fogalmával együtt HashMaps.

Ezenkívül feltártunk néhány külső könyvtárat, amelyek meglehetősen hasznosak a sekély és mély másolatok létrehozásához.

Ezen megvalósítások teljes forráskódja és az egységtesztek a GitHub projektben érhetők el.