本文共测试三种拷贝方式:

  1. 转成 JSON 再转回来
  2. 使用 Apache 的序列化工具类 SerializationUtils
  3. 新建 Map 时将原 Map 传入构造方法

前两种是深拷贝,第三种是浅拷贝。代码如下:

import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.SerializationUtils;import java.util.HashMap;
import java.util.Map;public class JSONDemo {public static void main(String[] args) {Map<String, Object> main = new HashMap<>();Map<String, Object> sub = new HashMap<>();Map<String, Object> subSub = new HashMap<>();subSub.put("name", "subSub");sub.put("name", "sub");sub.put("age", 1);sub.put("subSub", subSub);main.put("name", "main");main.put("sub", sub);System.out.println("原值:" + main);// 可以实现深拷贝Map<String, Object> jsonObject = JSON.parseObject(JSON.toJSONString(main));Map<String, Object> sub1 = (Map<String, Object>) jsonObject.get("sub");sub1.put("name", "sub1");Map<String, Object> subSub1 = (Map<String, Object>) sub1.get("subSub");subSub1.put("name", "subSub1");System.out.println("====== JSON方式:深拷贝,不影响原值");System.out.println("原值:" + main);System.out.println("新对象值:" + jsonObject);// 可以实现深拷贝// Map 没有实现 Serializable 接口,而 HashMap 实现了,所以必须转换成 HashMapMap<String, Object> clone = SerializationUtils.clone((HashMap<String, Object>) main);Map<String, Object> sub2 = (Map<String, Object>) clone.get("sub");sub2.put("name", "sub2");Map<String, Object> subSub2 = (Map<String, Object>) sub2.get("subSub");subSub2.put("name", "subSub2");System.out.println("====== clone方式:深拷贝,不影响原值");System.out.println("原值:" + main);System.out.println("新对象值:" + clone);// 不可以实现深拷贝HashMap<String, Object> newMap = new HashMap<>(main);Map<String, Object> sub3 = (Map<String, Object>) newMap.get("sub");sub3.put("name", "sub3");Map<String, Object> subSub3 = (Map<String, Object>) sub3.get("subSub");subSub3.put("name", "subSub3");System.out.println("====== 普通方式:浅拷贝,影响原值");System.out.println("原值:" + main);System.out.println("新对象值:" + newMap);System.out.println("sub == sub3:" + (sub == sub3));System.out.println("subSub == subSub3:" + (subSub == subSub3));}
}

运行结果如下:

原值:{sub={name=sub, subSub={name=subSub}, age=1}, name=main}
====== JSON方式:深拷贝,不影响原值
原值:{sub={name=sub, subSub={name=subSub}, age=1}, name=main}
新对象值:{"sub":{"name":"sub1","subSub":{"name":"subSub1"},"age":1},"name":"main"}
====== clone方式:深拷贝,不影响原值
原值:{sub={name=sub, subSub={name=subSub}, age=1}, name=main}
新对象值:{sub={name=sub2, subSub={name=subSub2}, age=1}, name=main}
====== 普通方式:浅拷贝,影响原值
原值:{sub={name=sub3, subSub={name=subSub3}, age=1}, name=main}
新对象值:{name=main, sub={name=sub3, subSub={name=subSub3}, age=1}}
sub == sub3:true
subSub == subSub3:true

Java Map 深拷贝方法相关推荐

  1. java map深拷贝_java 实现Map的深复制

    在java中有一个比较有趣的特性,在对对象进行=赋值,或者clone时候一般都是我们所说的浅复制, Object A = B; 也就是说我们获取的并非在堆中重新分配的一块内存,而是一个指向原有数据内存 ...

  2. getordefault java_Java map.getOrDefault()方法的用法详解

    Map.getOrDefault(Object key, V defaultValue)方法的作用是: 当Map集合中有这个key时,就使用这个key值: 如果没有就使用默认值defaultValue ...

  3. java 三种将list转换为map的方法详解

    这篇文章主要介绍了java 三种将list转换为map的方法详解的相关资料,需要的朋友可以参考下 java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法: 1) ...

  4. java中map的put方法,Java TreeMap put()方法

    Java TreeMap put()方法 java.util.TreeMap.put() 在Map中插入具有指定键的指定值. 1 语法 public V put(K key,V value) 2 参数 ...

  5. java map 输入 查询 修改_map的查询和修改方法

    packagecom.cn.util;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;import ...

  6. hashmap java 便利_java HashMap 循环遍历map的方法

    java HashMap 循环遍历map的方法(转) import java.util.ArrayList; import java.util.HashMap; import java.util.It ...

  7. [优雅代码]-调用java集合Map.computeIfAbsent()方法

    java版本JDK1.8 Map是我们经常使用的,在面对复杂Map时,我们怎么更好的去维护呢? 这里的复杂Map就是<K,V>中V是一个Collection集合比如: 那么它是一个复杂Ma ...

  8. java map setv_Java Jedis.hset方法代碼示例

    本文整理匯總了Java中redis.clients.jedis.Jedis.hset方法的典型用法代碼示例.如果您正苦於以下問題:Java Jedis.hset方法的具體用法?Java Jedis.h ...

  9. java 循环遍历嵌套map_java循环遍历map的方法

    //java HashMap 循环遍历map的方法 import java.util.ArrayList; import java.util.HashMap; import java.util.Ite ...

最新文章

  1. web服务器错误配置文件,web服务器http配置文件
  2. django学习笔记【003】创建第一个带有model的app
  3. 智源研究院联合多家权威机构上线“新冠肺炎(COVID-19)开放数据源”,打造全面、精细的新冠数据平台...
  4. MinGW安装与使用简介
  5. 三手火箭载二手飞船送四名平民上太空,马斯克负责创造历史,另一位富豪出钱买单...
  6. Eclipse非常有用的快捷键
  7. 发布或重启线上服务时抖动问题解决方案
  8. 【集训第四天·继续刷题】之 lgh怒刚ypj
  9. Cow Toll Paths(floyd变形)
  10. 协议簇: Media Access Control(MAC) Frame 解析
  11. 【EI会议】 2021年图像处理与智能控制国际学术会议(IPIC 2021)
  12. 忘了微信密码怎么办_微信支付密码怎么改?微信支付密码忘了怎么办?详细教程来了!...
  13. HTML中的table和div
  14. python和c语言的区别-C语言、Java语言和python语言的区别在哪里
  15. python中求平方根函数_Python中的平方根函数有什么问题?
  16. 安卓 Share微博客户端 3.9 精简高级版 修改版
  17. SEO的关键字分析的浅析
  18. 阿里云疯狂促销 公有云之战刚鸣枪
  19. TCP接收窗口--确定Window
  20. Python学了可以干嘛?到底赚钱吗?看完这篇文章你就懂了

热门文章

  1. 【历史上的今天】7 月 9 日:第一部计算机特效电影问世;浏览器之父出生;游戏《大金刚》发布
  2. linux下通过命令行使用Vtune统计处理器微体系结构特征
  3. html设置按钮样式表,如何使用样式表设置QToolButton的图标?
  4. iOS开源加密相册Agony的实现(四)
  5. git 卡住推不上去
  6. Spring框架 -- 开篇搭建脚手架
  7. 知网检测”独创性声明”、“版权声明”吗
  8. JavaWeb项目-快递代领-需求规格说明书(一)-软件工程-小组项目
  9. 数学真题 2014-2015
  10. (谷粒项目八)poi基础应用,读取excel公式、导出大Excel方案