Java HashMap克隆 – 浅拷贝和深拷贝

培训教学 潘老师 7个月前 (10-11) 482 ℃ (0) 扫码查看

学习如何在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的浅复制有任何问题,请告诉我。

3.扩展阅读

数组的浅拷贝和深拷贝

ArrayList的浅拷贝与深拷贝


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9433.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】