Копиране на HashMap в Java

1. Общ преглед

В този урок ще изследваме концепцията за плитко срещу дълбоко копие на HashMap заедно с няколко техники за копиране на HashMap в Java.

Ще разгледаме и някои от външните библиотеки, които могат да ни помогнат в конкретни случаи.

2. Плитки срещу дълбоки копия

Първо, нека разберем концепцията за плитки и дълбоки копия в HashMaps .

2.1. Плитко копие

Плитко копие на HashMap е нов HashMap с присвояване на същите ключови и стойностни обекти като оригиналния HashMap .

Например ще създадем клас Employee и след това карта с екземпляри на Employee като стойности:

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

Сега ще проверим, че оригиналната карта и нейното плитко копие са различни обекти:

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

Тъй като това е плитко копие, ако променим свойствата на екземпляр на служител , това ще засегне както оригиналната карта, така и нейното плитко копие:

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

2.2. Дълбоко копиране

Дълбоко копие на HashMap е ново HashMap, което дълбоко копира всички съпоставяния. Следователно той създава нови обекти за всички ключове, стойности и съпоставяния.

Тук изричното модифициране на съответствията (ключ-стойности) няма да повлияе на дълбокото копие:

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

3. API на HashMap

3.1. Използване на HashMap C onstructor

HashMap е параметризирана конструктор HashMap (Map м) осигурява бърз начин за плитка копирате цяла карта:

HashMap shallowCopy = new HashMap(originalMap); 

3.2. Използване на Map.clone ()

Подобно на конструктора, методът на клониране HashMap # също създава бързо плитко копие:

HashMap shallowCopy = originalMap.clone(); 

3.3. Използване на Map.put ()

А HashMap може лесно да бъде плитко-копирани от повтаряне над всяко вписване и се обадите на пут () метода на друга карта:

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

3.4. Използване на Map.putAll ()

Вместо да итерираме през всички записи, можем да използваме метода putAll () , който плитко копира всички съпоставяния в една стъпка:

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

Трябва да отбележим, че put () и putAll () заместват стойностите, ако има съвпадащ ключ .

Също така е интересно да се отбележи, че ако погледнем конструктора на HashMap , clone () и putAll () , ще открием, че всички те използват един и същ вътрешен метод за копиране на записи - putMapEntries () .

4. Копиране на HashMap с помощта на Java 8 Stream API

Можем да използваме Java 8 Stream API, за да създадем плитко копие на HashMap :

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

5. Google Гуава

Използвайки Guava Maps, можем лесно да създадем неизменяеми карти, заедно със сортираната и би карта. За да направим неизменяемо, плитко копие на която и да е от тези карти, можем да използваме метода 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

Сега Java няма вградени реализации за дълбоко копиране. Така че, за да направим дълбоко копие, или можем да заменим метода clone () , или да използваме техника за сериализация-десериализация.

Apache Commons има SerializationUtils с метод clone () за създаване на дълбоко копие. За това всеки клас, който трябва да бъде включен в дълбоко копие, трябва да реализира интерфейс за сериализиране :

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

7. Заключение

В този бърз урок видяхме различни техники за копиране на HashMap в Java, заедно с концепцията за плитко и дълбоко копиране за HashMap s.

Също така изследвахме някои от външните библиотеки, които са доста удобни за създаване на плитки и дълбоки копия.

Пълният изходен код на тези внедрения заедно с модулните тестове са налични в проекта GitHub.