行业资讯 2025年08月6日
0 收藏 0 点赞 983 浏览 1856 个字
摘要 :

文章目录 1.实现Map的浅拷贝 1.1. 使用HashMap.clone() 1.2. 使用Java 8 Stream 2. 实现Map的深拷贝 3.扩展阅读 学习如何在Java中创建HashMap的克隆。我们将看到创建……




  • 1.实现Map的浅拷贝
    • 1.1. 使用HashMap.clone()
    • 1.2. 使用Java 8 Stream
  • 2. 实现Map的深拷贝
  • 3.扩展阅读

学习如何在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.zuozi.net/9355.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号