java 深拷贝和浅拷贝

浅拷贝:

创建一个新对象,会很精确的复制原来对象属性类型或者属性引用地址。

如:List<T> list1 = list,List<T> list2 = new ArrayList<T>();

list2.addAll(list1)或者list2 = list1.clone();

都是通过浅拷贝得到的。但是这样我们在操作拷贝后的文件时,会影响到原来对象。

这时候深拷贝就该上场了

深拷贝:

是将原有对象的属性和地址重新复制一份,这样在操作复制后的对象时,就不会对原有的对象有影响了,但是深拷贝相较于浅拷贝在速度上会慢一点、空间上会大一些。

深拷贝实现是通过串行化来做深度复制,是先使对象实现Serializable接口(很重要),然后把对象写到一个流中,再从流中读取出来,便可以创建新的对象。

T implements Serializable 很重要 很重要  重要的事说三遍。

public static <T> List<T> deepCopy(List<T> src){
    List<T> dest = null;
    try {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(src);

        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        dest = (List<T>) in.readObject();
    }catch (Exception e){
        logger.error(e.getMessage());
    }
    return dest;
}
------------------------------------------------------------------------------------------------
也可以将需要copy 的数据先转换成json   然后再转换成所需要的object (copy对象较大的情况)
之前做某一个模块的时候深拷贝的效率不是很好 最后通过Gson处理的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值