文
章
目
录
章
目
录
学习如何在Java中创建HashMap的克隆。我们将看到创建HashMap的浅拷贝和深拷贝的Java程序。
1.实现Map的浅拷贝
我们可以以两种方式创建给定HashMap的浅复制。第一种方法使用clone()方法,第二种方法是通过迭代Map并将Map的键和值复制到新的Map中。
在示例中,我们将使用以下Person类。
@Data
@AllArgsConstructor
@NoArgsConstructor
public 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)));
//浅拷贝
HashMap<Integer, Person> clonedMap = (HashMap<Integer, Person>) personMap.clone();
//和personMap一样
Assertions.assertTrue(Maps.difference(personMap, clonedMap).areEqual());
让我们更改拷贝的Map中的一个值,并验证在原始Map中是否可见。
clonedMap.get(1).setName("Charles");
Assertions.assertEquals(clonedMap.get(1).getName(), personMap.get(1).getName());
1.2. 使用Java 8 Stream
如果我们希望对复制到克隆HashMap的值进行一些自定义,或者只是想修改各个键值对的克隆过程,那么可以使用Java 8流API。
在这种方法中,使用流迭代HashMap条目集,对值进行自定义,然后将这些键值对收集到新的HashMap中。
Map<Integer, Person> clonedMapWithStream = personMap.entrySet()
.stream()
//执行自定义
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Assertions.assertTrue(Maps.difference(personMap, clonedMapWithStream).areEqual());
2. 实现Map的深拷贝
深拷贝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());
如果您对在Java中深度拷贝HashMap或创建HashMap的浅复制有任何问题,请告诉我。