Copia di una HashMap in Java

1. Panoramica

In questo tutorial, esploreremo il concetto di una copia superficiale o profonda di una HashMap insieme a diverse tecniche per copiare una HashMap in Java.

Considereremo anche alcune delle librerie esterne che possono aiutarci in casi specifici.

2. Copie poco profonde e profonde

Innanzitutto, comprendiamo il concetto di copie superficiali e profonde in HashMaps .

2.1. Copia superficiale

Una copia superficiale di una HashMap è una nuova HashMap con mappature agli stessi oggetti chiave e valore della HashMap originale .

Ad esempio, creeremo una classe Employee e quindi una mappa con istanze Employee come valori:

public class Employee { private String name; // constructor, getters and setters } 
HashMap map = new HashMap(); Employee emp1 = new Employee("John"); Employee emp2 = new Employee("Norman"); map.put("emp1", emp1); map.put("emp2", emp2); 

Ora verificheremo che la mappa originale e la sua copia superficiale siano oggetti diversi:

HashMap shallowCopy = // shallow copy implementation assertThat(shallowCopy).isNotSameAs(map);

Poiché si tratta di una copia superficiale, se modifichiamo le proprietà di un'istanza Employee , influirà sia sulla mappa originale che sulla sua copia superficiale:

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

2.2. Copia profonda

Una copia completa di una HashMap è una nuova HashMap che copia profondamente tutte le mappature. Pertanto, crea nuovi oggetti per tutte le chiavi, i valori e le mappature.

In questo caso, la modifica esplicita delle mappature (valori-chiave) non influirà sulla copia completa:

HashMap deepCopy = // deep copy implementation emp1.setFirstName("Johny"); assertThat(deepCopy.get("emp1")).isNotEqualTo(map.get("emp1")); 

3. API HashMap

3.1. Utilizzando la HashMap C onstructor

HashMap s' parametrizzato costruttore HashMap (Mappa m) fornisce un modo rapido per copia superficiale un'intera mappa:

HashMap shallowCopy = new HashMap(originalMap); 

3.2. Utilizzando Map.clone ()

Simile al costruttore, il metodo HashMap # clone crea anche una rapida copia superficiale:

HashMap shallowCopy = originalMap.clone(); 

3.3. Utilizzando Map.put ()

Una HashMap può essere facilmente copiata in modo superficiale iterando su ogni voce e chiamando il metodo put () su un'altra mappa:

HashMap shallowCopy = new HashMap(); Set
    
      entries = originalMap.entrySet(); for (Map.Entry mapEntry : entries) { shallowCopy.put(mapEntry.getKey(), mapEntry.getValue()); } 
    

3.4. Utilizzando Map.putAll ()

Invece di iterare tutte le voci, possiamo usare il metodo putAll () , che copia in modo superficiale tutte le mappature in un unico passaggio:

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

Dobbiamo notare che put () e putAll () sostituiscono i valori se esiste una chiave corrispondente .

È anche interessante notare che, se guardiamo al costruttore di HashMap , all'implementazione di clone () e putAll () , scopriremo che tutti usano lo stesso metodo interno per copiare le voci - putMapEntries () .

4. Copia di HashMap utilizzando Java 8 Stream API

Possiamo utilizzare l' API Java 8 Stream per creare una copia superficiale di una HashMap :

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

5. Google Guava

Utilizzando Guava Maps, possiamo facilmente creare mappe immutabili, insieme alla mappa ordinata e bi. Per creare una copia immutabile e superficiale di una qualsiasi di queste mappe, possiamo utilizzare il metodo copyOf :

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

6. Apache Commons Lang

Ora, Java non ha implementazioni di copia profonda integrate. Quindi, per fare una copia completa, possiamo sovrascrivere il metodo clone () o utilizzare una tecnica di serializzazione-deserializzazione.

Apache Commons ha SerializationUtils con un metodo clone () per creare una copia completa. Per questo, qualsiasi classe da includere in copia completa deve implementare l' interfaccia Serializable :

public class Employee implements Serializable { // implementation details } HashMap deepCopy = SerializationUtils.clone(originalMap);

7. Conclusione

In questo rapido tutorial, abbiamo visto varie tecniche per copiare una HashMap in Java, insieme al concetto di copia superficiale e profonda per HashMap s.

Inoltre, abbiamo esplorato alcune delle librerie esterne che sono molto utili per creare copie superficiali e profonde.

Il codice sorgente completo di queste implementazioni insieme agli unit test sono disponibili nel progetto GitHub.