问题:spring boot/JPA项目中,修改某个对象以后需要生成一个VO对象给客户端,数据库对应的POJO对象里有个Map类型的对象(名字叫para),这个对象的value又是个Map,我使用Map的putAll()方法拷贝了一份para,然后修改里面的值,最后发现para的内容也被修改了。示例代码如下:

this.para.putAll(po.getPara());
// fields是para下面的一个Map参数,此处本意是返回给客户端的fields元素中不包含aaa和bbb两个字段List<Map<String, Object>> fields = (List<Map<String, Object>>)this.para.get("fields");fields.forEach(item -> {item.remove("aaa");item.remove("bbb");});

以上代码出现的问题是,返回给界面的VO中确实没有了aaa和bbb两个字段,但不幸的是,对应数据库中的fields中也没有了这两个字段,这不是期望的。

原因:map的putAll实现的是浅拷贝。

解决方法:实现深拷贝,有三种方式:

  1. 手动赋值,效率高,但代码过于啰嗦。
  2. 序列化与反序列化,使用SerializationUtils的clone(Object obj)方法,要求拷贝的对象实现了Serializable,Map不行,使用HashMap即可。
  3. 用fastjson从Object转成json,然后转回object,本质上是反射:
     private Object deepCopyByJson(Object obj) {String json = JSON.toJSONString(obj);return JSON.parseObject(json, Object.class);}

    具体使用哪种方法视具体场景而定,我解决这个问题用的是SerializationUtils,性能要求不高的情况下代码简洁也很重要。

  4. 解决方式:

this.para = (Map<String, Object>) SerializationUtils.clone((HashMap<String, Object>)po.getPara());

java深拷贝的三种方式相关推荐

  1. Java操作Excel三种方式POI、Hutool、EasyExcel

    Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...

  2. Java循环的三种方式分享

    转自: Java循环的三种方式分享 下文笔者讲述java循环的三种方式分享,如下所示 一.while循环 while语法:while(循环条件){循环体}while关键字处理循环先判断循环条件当条件成 ...

  3. 面试官 | Java转List三种方式,你说说吧。我。。懵逼。啥时候有三种了

    Hi 我是小小,我们又见面了,本文主要介绍Java数组转List的三种方式以及对比 前言 本文主要介绍Java中数组转为List的三种情况的优劣对比,以及应用场景. 第一种 通过 Arrays.asL ...

  4. java实现线程三种方式_详解三种java实现多线程的方式

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...

  5. java反射的三种方式以及一些常用方法

    1.获取类的三种方式 第一种:使用Class.forName(String classPath) //ClassPath:写需要反射的类名,一般是以包名.类名 注意事项:这里会产生一个ClassNot ...

  6. Jmeter引用外部Java文件的三种方式

    首先,我们来了解一下Jmeter引用外部Java文件的应用场景:说一个最常见的场景,比如做接口测试时,登录接口密码为加密传输,加密的算法由后端开发提供,只要后端开发语言是Java,那么他提供给你的加密 ...

  7. JS实现深拷贝的三种方式

    深浅拷贝是面试中经常会被问到的问题,哥们这会帮大家整理一下,浅拷贝不写了,这次主要是深拷贝. 看段代码 let obj = {a:1,b:{c: 1},}let copyObj = objcopyOb ...

  8. java字符串反转三种方式

    将一个字符串进行反转.将字符串中指定部分进行反转.比如"abcdefg"反转为"abfedcg". public class StringDemo {/*将一个 ...

  9. Java数组初始化三种方式

    初始化方式: 静态初始化 int[] intArr; intArr = new int[]{1,2,3,4,5,9}; 简化的静态初始化方式 String[] strArr = {"张三&q ...

最新文章

  1. 计算机基础知识精品课程,计算机应用基础精品课
  2. linux中怎么删除只读变量,【Linux】【问题集锦】如何删除shell只读变量
  3. iOS - OC PList 数据存储
  4. 帝国cms怎么增加php,帝国CMS增加系统配置字段
  5. oracle知识博客链接
  6. HashMap vs ConcurrentHashMap — 示例及Iterator探秘
  7. css两列显示,div+css如何控制信息分两列显示?
  8. Creating Options Pages
  9. java ajax分页_使用Jquery+Ajax+Json如何实现分页显示附JAVA+JQuery实现异步分页
  10. 矿机 矿场 矿池 关系和区别
  11. piap.excel 微软 时间戳转换mssql sql server文件时间戳转换unix 导入mysql
  12. c语言程序设计教程实验指导吴国栋,C语言程序设计教程实验指导
  13. 优化数据库的八种经典方式
  14. fatal: unable to access ‘https://github xxxxxxxxx的解决方法
  15. windows应用下面卸载不干净如何解决!
  16. p2p通信原理及实现
  17. ASP.NET DATETIME
  18. 充电器电压和电池电压关系
  19. 石墨烯在生物医学上应用的研究进展_多孔石墨烯的制备及应用
  20. 2.QT+Opencv读取图片

热门文章

  1. 编译超频Android内核,安卓超频工具apk下载
  2. SMAA算法详解 - SMAAEdgeDetectionVS
  3. 区块链去中心化有什么优势?
  4. Hyper-V 的用途与安装
  5. SVN冲突 One or more files are in a conflicted state
  6. 硬路由、软路由、主路由、旁路由对比分析
  7. c语言 字符转二进制输出,C语言 如何把一个ASCII码转换为二进制输出?
  8. 自学MBA,我推荐你看这本《MBA必读12篇》
  9. CSS第四篇(复合选择器)
  10. Web中间件常见安全漏洞