Научитесь создавать клон HashMap в Java. Мы увидим программы Java для создания поверхностной и глубокой копии HashMap.
1. Создание поверхностной копии карты
Мы можем создать поверхностную копию заданного HashMap двумя способами. Первый способ использует метод clone(), а второй — итерацию по Map и копирование ключей и значений Map в новую Map.
В примерах мы будем использовать следующий класс Person.
@Data@AllArgsConstructor@NoArgsConstructorpublic class Person {long id;String name;LocalDate dateOfBirth;}
1.1.Использование HashMap.clone()
Лучший способ создать поверхностную копию Map — использовать ее метод clone(). Сами ключи и значения не клонируются и указывают на тот же объект в памяти, что и в исходной карте.
HashMap<Integer, Person> personMap = new HashMap<>();personMap.put(1, new Person(1l, "Alex", LocalDate.of(1990, 01, 01)));personMap.put(2, new Person(2l, "Bob", LocalDate.of(1990, 02, 01)));//Shallow cloneHashMap<Integer, Person> clonedMap =(HashMap<Integer, Person>) personMap.clone();//Same as personMapAssertions.assertTrue(Maps.difference(personMap, clonedMap).areEqual());
Давайте изменим значение в клонированной карте и убедимся, что изменение видно и на исходной карте.
clonedMap.get(1).setName("Charles");Assertions.assertEquals(clonedMap.get(1).getName(), personMap.get(1).getName());
1.2 Использование потока Java 8
Если нам требуется небольшая настройка значений, копируемых в клонированный HashMap, или мы просто хотим изменить процесс клонирования для отдельных пар ключ-значение, то мы можем использовать Java 8 stream api.
При таком подходе выполняется итерация по набору записей HashMap с помощью Stream, выполняется настройка значений, а затем сбор пар в новом HashMap.
Map<Integer, Person> clonedMapWithStream = personMap.entrySet().stream()//perform customization.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));Assertions.assertTrue(Maps.difference(personMap, clonedMapWithStream).areEqual());
2. Создание глубокой копии карты
Самый эффективный способ глубокого клонирования объекта Java — сериализация. То же самое относится и к глубокому клонированию HashMap. Здесь мы используем библиотеку Google Gson для сериализации HashMap и десериализации его для создания глубокой копии HashMap.
Gson gson = new Gson();String jsonString = gson.toJson(personMap);Type type = new TypeToken<HashMap<Integer, Employee>>(){}.getType();HashMap<Integer, Employee> deepClonedMap = gson.fromJson(jsonString, type);Assertions.assertTrue(Maps.difference(personMap, deepClonedMap).areEqual());
Теперь, если мы изменим содержимое ключей и значений в первой карте, ключи и значения второй карты останутся неизменными.
deepClonedMap.get(1).setName("Charles");Assertions.assertFalse(Maps.difference(personMap, deepClonedMap).areEqual());
Дайте мне знать, если у вас возникнут вопросы о глубоком клонировании HashMap или создании поверхностной копии HashMap в Java.