Menyalin HashMap di Java

1. Ikhtisar

Dalam tutorial ini, kita akan menjelajahi konsep salinan HashMap dangkal vs dalam bersama dengan beberapa teknik untuk menyalin HashMap di Java.

Kami juga akan mempertimbangkan beberapa pustaka eksternal yang dapat membantu kami dalam kasus tertentu.

2. Salinan Dangkal vs Dalam

Pertama, mari kita pahami konsep salinan dangkal dan dalam di HashMaps .

2.1. Salinan dangkal

Salinan dangkal dari HashMap adalah baru HashMap dengan pemetaan untuk kunci dan nilai objek yang sama seperti aslinya HashMap .

Misalnya, kita akan membuat kelas Karyawan dan kemudian peta dengan instance Karyawan sebagai nilai:

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); 

Sekarang, kami akan memverifikasi bahwa peta asli dan salinan dangkal adalah objek yang berbeda:

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

Karena ini adalah salinan dangkal, jika kita mengubah properti turunan Karyawan , ini akan memengaruhi peta asli dan salinan dangkal:

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

2.2. Deep Copy

Salinan mendalam dari HashMap adalah HashMap baru yang menyalin semua pemetaan secara mendalam. Oleh karena itu, ini membuat objek baru untuk semua kunci, nilai, dan pemetaan.

Di sini, mengubah pemetaan secara eksplisit (nilai kunci) tidak akan memengaruhi deep copy:

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

3. API HashMap

3.1. Menggunakan onstruktor HashMap C.

HashMap 's parameter konstruktor HashMap (Peta m) menyediakan cara cepat untuk dangkal menyalin seluruh peta:

HashMap shallowCopy = new HashMap(originalMap); 

3.2. Menggunakan Map.clone ()

Mirip dengan konstruktor, metode klon HashMap # juga membuat salinan dangkal cepat:

HashMap shallowCopy = originalMap.clone(); 

3.3. Menggunakan Map.put ()

Sebuah HashMap dapat dengan mudah menjadi dangkal-disalin oleh iterasi atas setiap entri dan memanggil put () metode peta lain:

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

3.4. Menggunakan Map.putAll ()

Alih-alih melakukan iterasi melalui semua entri, kita bisa menggunakan metode putAll () , yang akan menyalin semua pemetaan dalam satu langkah:

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

Kita harus mencatat bahwa put () dan putAll () mengganti nilai jika ada kunci yang cocok .

Menarik juga untuk dicatat bahwa, jika kita melihat konstruktor HashMap , clone () , dan implementasi putAll () , kita akan menemukan semuanya menggunakan metode internal yang sama untuk menyalin entri - putMapEntries () .

4. Menyalin HashMap Menggunakan Java 8 Stream API

Kita dapat menggunakan Java 8 Stream API untuk membuat salinan HashMap yang dangkal :

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

5. Google Guava

Dengan Guava Maps, kita dapat dengan mudah membuat peta yang tidak dapat diubah, bersama dengan peta yang diurutkan dan bi. Untuk membuat salinan dangkal dari salah satu peta ini, kita dapat menggunakan metode 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

Sekarang, Java tidak memiliki implementasi deep copy bawaan. Jadi untuk membuat salinan dalam, kita bisa mengganti metode clone () atau menggunakan teknik serialisasi-deserialisasi.

Apache Commons memiliki SerializationUtils dengan metode clone () untuk membuat salinan dalam. Untuk ini, kelas apa pun yang akan disertakan dalam salinan dalam harus mengimplementasikan antarmuka yang dapat diserialkan :

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

7. Kesimpulan

Dalam tutorial singkat ini, kami telah melihat berbagai teknik untuk menyalin HashMap di Java, bersama dengan konsep salinan dangkal dan dalam untuk HashMap .

Juga, kami menjelajahi beberapa pustaka eksternal yang cukup berguna untuk membuat salinan dangkal dan dalam.

Kode sumber lengkap dari implementasi ini bersama dengan pengujian unit tersedia di proyek GitHub.