ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

引用对象深度复制的简单实现方法

2019-11-08 15:00:07  阅读:276  来源: 互联网

标签:dataList JSONObject List 复制 引用 深度 tClass 序列化


我们有时候会遇到某个List集合循环几次并修改其属性或赋值给其他集合等操作,但当程序运行完会发现,运行的结果并不如预期,有可能第二次循环的时候原List内的数据已经发生了变化,但我们没有直接的去修改原List的内容,比如下面的例子:

List<DataObject> dataList = new ArrayList<>();
dataObject1.setId(13);
dataList.add(dataObject1);
List<DataObject> newDataList = new ArrayList<>();
newDataList.add(dataList.get(0));
DataObject dataObject2 = newDataList.get(0);
dataObject2.setId(15);

我们并没有直接修改dataList的数据,而是赋值给新的对象后再操作的新的对象,但执行后发现,dataList的数据也会跟着改变,因为dataObject1是个应用类型对象,它的地址并没有因为赋值到新的集合内而改变,即使你new一个DataObject,然后 = dataObject1或者调用clone方法,地址依然没有改变,这是因为引用类型的对象在复制时只是浅度复制,并没有重新生成一个对象,而基本类型则不会有这个问题。

那怎么解决这个问题呢?网上有许多方法,比如Cloneable、序列化等等,写起来比较麻烦,并且有时还需要trycatch,这个有一个简单的方法来实现对象的深度复制,那就是利用JSONObject的转换实现,其实也是通过序列化的方式,但不用亲自动手去序列化反序列化:

JSONObject.parseArray(JSONObject.toJSONString(dataList)).toJavaList(DataObject.Class)

先将dataList转成jsonString,即序列化,然后再转成jsonArray并转成java对象,即反序列化

转换前:

 

 转换后:

 

 最后提供一下使用这个封装的工具类,两个方法,一个复制单对象,一个复制List集合:

    /**
     * @author: shenzhikui
     * @description: 利用json转换实现变相深度复制
     * @date: 2019/11/7
     * @param data
     * @param tClass
     * @return
     */
    public static <T> T deepCopy(T data, Class<T> tClass){
        T bakData = JSONObject.parseObject(JSONObject.toJSONString(data)).toJavaObject(tClass);
        return bakData;
    }

    /**
     * @author: shenzhikui
     * @description: 利用json转换实现变相深度复制 list
     * @date: 2019/11/7
     * @param dataList
     * @param tClass
     * @return 
     */
    public static <T> List<T> deepCopy(List<T> dataList, Class<T> tClass){
        List<T> bakList = new ArrayList<>();
        if(null != dataList && dataList.size() > 0){
            bakList.addAll(JSONObject.parseArray(JSONObject.toJSONString(dataList)).toJavaList(tClass));
        }
        return bakList;
    }

 使用方法:

List<DataObject> newDataList = deepCopy(dataList,DataObject.class);

 

标签:dataList,JSONObject,List,复制,引用,深度,tClass,序列化
来源: https://www.cnblogs.com/nvsky/p/11820274.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有