zoukankan      html  css  js  c++  java
  • 【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     }
    View Code

    二、转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 }
    View Code

    对象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 }
    View Code

    对象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 }
    View Code

    测试代码

     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 }
    View Code

     测试代码输出

    三、转json方式实现数组对象拷贝(能够达到深拷贝的效果)

    3.1、实现原理

    step1:将原数组对象转换为JSONArray格式数据

    step2:将JSONArray格式数据再转回原数组对象格式(需注意:此时数组对象中的元素是JSONObject格式) 

    step3:将step2中的每一个元素(JSONObject格式)转换为原指定对象格式

    step4:step3完成后 即可赋值给一个新的对象

  • 相关阅读:
    thymeleaf时间戳转换
    alerttemplate 时间戳转换
    jQuery.Deferred exception: a.indexOf is not a function TypeError: a.indexOf is not a function
    区分数据是对象还是字符串
    eclipse中选取一列快捷键
    图片拉伸不变型
    这里ajax需要改成同步
    idea如何整理代码格式
    20170311-起早床
    20190310-解决头屑
  • 原文地址:https://www.cnblogs.com/danhuai/p/11883325.html
Copyright © 2011-2022 走看看