【Java】+复制对象 不影响原来的值
一、BeanUtils.copyProperties(仅能实现浅拷贝 深拷贝不行)

1 @Test 2 public void testeee() { 3 List<DeliveryContentVO> contentVOList = new ArrayList<>(); 4 DeliveryContentVO contentVO1 = new DeliveryContentVO(); 5 contentVO1.setId("1"); 6 contentVO1.setIndex(1); 7 contentVOList.add(contentVO1); 8 9 DeliveryContentVO contentVO2 = new DeliveryContentVO(); 10 try { 11 BeanUtils.copyProperties(contentVO2,contentVO1); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } 15 contentVO2.setId("2"); 16 contentVO2.setIndex(2); 17 contentVOList.add(contentVO2); 18 19 System.out.println(JSONObject.toJSON(contentVOList)); 20 }
二、转json方式实现对象拷贝(能够达到深拷贝的效果)
2.1、实现原理:
超简单 一行代码轻松搞定
step1:将原对象转换为JSONObject格式数据
step2:将JSONObject格式数据再转回原对象格式
step3:将step2转换后的数据赋值给一个新的对象
2.2、代码示例:
对象1

1 package copy; 2 3 public class ObjectA { 4 private String a1; 5 private int a2; 6 7 public String getA1() { 8 return a1; 9 } 10 11 public void setA1(String a1) { 12 this.a1 = a1; 13 } 14 15 public int getA2() { 16 return a2; 17 } 18 19 public void setA2(int a2) { 20 this.a2 = a2; 21 } 22 23 }
对象2

1 package copy; 2 3 public class ObjectB { 4 String b1; 5 int b2; 6 7 public String getB1() { 8 return b1; 9 } 10 11 public void setB1(String b1) { 12 this.b1 = b1; 13 } 14 15 public int getB2() { 16 return b2; 17 } 18 19 public void setB2(int b2) { 20 this.b2 = b2; 21 } 22 23 }
对象3

1 package copy; 2 3 public class MyObject { 4 private String myObject; 5 private ObjectA myObjectA; 6 private ObjectB myObjectB; 7 8 public String getMyObject() { 9 return myObject; 10 } 11 12 public void setMyObject(String myObject) { 13 this.myObject = myObject; 14 } 15 16 public ObjectA getMyObjectA() { 17 return myObjectA; 18 } 19 20 public void setMyObjectA(ObjectA myObjectA) { 21 this.myObjectA = myObjectA; 22 } 23 24 public ObjectB getMyObjectB() { 25 return myObjectB; 26 } 27 28 public void setMyObjectB(ObjectB myObjectB) { 29 this.myObjectB = myObjectB; 30 } 31 }
测试代码

1 package copy; 2 3 import com.alibaba.fastjson.JSONObject; 4 5 public class TestCopy { 6 public static void main(String[] args) { 7 /** step1 原数据初始化 */ 8 MyObject myObject = new MyObject(); 9 myObject.setMyObject("原对象my"); 10 11 ObjectA objectA = new ObjectA(); 12 objectA.setA1("原对象objectA1"); 13 objectA.setA2(666); 14 15 ObjectB objectB = new ObjectB(); 16 objectB.setB1("原对象objectB1"); 17 objectB.setB2(999); 18 19 myObject.setMyObjectA(objectA); 20 myObject.setMyObjectB(objectB); 21 22 /** step2 拷贝(原理为:将原对象转换为json格式 然后再转回原对象的格式 最后赋值给新对象) */ 23 // 方式1(清楚写法) 24 //MyObject myObjectNew; 25 //JSONObject jsonObject = (JSONObject) JSONObject.toJSON(myObject); 26 //myObjectNew = JSONObject.toJavaObject(jsonObject, MyObject.class); 27 28 // 方式2(简化写法) 29 MyObject myObjectNew = JSONObject.toJavaObject((JSONObject) JSONObject.toJSON(myObject), MyObject.class); 30 31 /** step3 改变新对象的值 */ 32 myObjectNew.setMyObject("xin"); 33 myObjectNew.getMyObjectA().setA1("xin"); 34 35 /** step4 校验 改变新对象的数据 看原对象的数据是否会变(不会) */ 36 System.out.println(String.format("原数据:%s", JSONObject.toJSON(myObject))); 37 System.out.println(String.format("新数据:%s", JSONObject.toJSON(myObjectNew))); 38 } 39 }
测试代码输出
三、转json方式实现数组对象拷贝(能够达到深拷贝的效果)
3.1、实现原理
step1:将原数组对象转换为JSONArray格式数据
step2:将JSONArray格式数据再转回原数组对象格式(需注意:此时数组对象中的元素是JSONObject格式)
step3:将step2中的每一个元素(JSONObject格式)转换为原指定对象格式
step4:step3完成后 即可赋值给一个新的对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义