Menyalin HashMap di Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan meneroka konsep salinan HashMap yang cetek dan mendalam bersama dengan beberapa teknik untuk menyalin HashMap di Java.

Kami juga akan mempertimbangkan beberapa perpustakaan luaran yang dapat membantu kami dalam kes tertentu.

2. Salinan Cetek vs Dalam

Pertama, mari kita fahami konsep salinan cetek dan mendalam dalam HashMaps .

2.1. Salinan Cetek

Salinan cetek yang HashMap adalah baru HashMap dengan pemetaan ke kekunci dan nilai yang sama objek seperti yang asal HashMap .

Sebagai contoh, kami akan membuat kelas Pekerja dan kemudian peta dengan contoh Pekerja 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 mengesahkan bahawa peta asal dan salinan ceteknya adalah objek yang berbeza:

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

Kerana ini adalah salinan yang cetek, jika kita mengubah harta benda pekerja , ia akan mempengaruhi peta asal dan salinan ceteknya:

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

2.2. Salinan Dalam

Salinan dalam HashMap adalah HashMap baru yang menyalin semua pemetaan secara mendalam. Oleh itu, ia mencipta objek baru untuk semua kunci, nilai, dan pemetaan.

Di sini, mengubah pemetaan secara jelas (nilai-kunci) tidak akan mempengaruhi salinan mendalam:

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

3. API HashMap

3.1. Menggunakan HashMap C onstructor

Pembangun parameter HashMap HashMap (Peta m) menyediakan cara cepat untuk menyalin cetek keseluruhan peta:

HashMap shallowCopy = new HashMap(originalMap); 

3.2. Menggunakan Map.clone ()

Sama dengan konstruktor, kaedah HashMap # clone juga membuat salinan cetek cepat:

HashMap shallowCopy = originalMap.clone(); 

3.3. Menggunakan Map.put ()

A HashMap boleh menjadi cetek disalin oleh iterating ke atas setiap masuk dan memanggil put () kaedah pada peta yang 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 ()

Daripada melakukan iterasi melalui semua entri, kita dapat menggunakan kaedah putAll () , yang menyalin cetek semua pemetaan dalam satu langkah:

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

Kita harus perhatikan bahawa put () dan putAll () menggantikan nilai jika ada kunci yang sepadan .

Juga menarik untuk diperhatikan bahawa, jika kita melihat pelaksanaan HashMap konstruktor, klon () , dan putAll () , kita akan mendapati semuanya menggunakan kaedah dalaman 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 cetek :

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

5. Jambu Batu Google

Dengan menggunakan Peta Jambu Batu, kita dapat dengan mudah membuat peta yang tidak berubah, bersama dengan peta yang disusun dan bi. Untuk membuat salinan cetek dan cetek dari peta ini, kita boleh menggunakan kaedah 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 mempunyai implementasi salinan dalam yang ada. Oleh itu, untuk membuat salinan mendalam, baik kita dapat mengganti kaedah klon () atau menggunakan teknik serialisasi-deserialisasi.

Apache Commons mempunyai kaedah SerializationUtils dengan klon () untuk membuat salinan dalam. Untuk ini, mana-mana kelas yang akan disertakan dalam salinan dalam mesti melaksanakan antara muka Serializable :

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

7. Kesimpulannya

Dalam tutorial ringkas ini, kami telah melihat pelbagai teknik untuk menyalin HashMap di Java, bersama dengan konsep salinan cetek dan dalam untuk HashMap s.

Kami juga meneroka beberapa perpustakaan luaran yang cukup berguna untuk membuat salinan cetek dan dalam.

Kod sumber lengkap pelaksanaan ini bersamaan dengan ujian unit terdapat dalam projek GitHub.