深拷贝使用解析

Posted superchong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝使用解析相关的知识,希望对你有一定的参考价值。

一,问题分析

  在实际开发过程中,遇到过统计相关的问题,对一个实体类中的数据进行合计,或按照某一函数进行过滤或者累计,由于java引用的是地址,这样就带来操作问题。

如:

Table<Object,Object,Object> table = HashBasedTable.create();
Table table2 = table;
.......//对table进行操作,这时,table2也跟着变化

原因就在于,java 使用的是浅拷贝,拷贝的是地址

二,解决方案

这时可以使用java提供的clone函数,但实际使用过程中对象往往嵌套包装,对于其包装属性需要循环嵌套clone,为了解决这一问题,引入流对象进行clone。

代码如下:

public static Object cloneObject(Object obj) throws Exception {

        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(obj);

        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        return in.readObject();
    }

 

三,测试:

public static void main(String[] args) {
        Table oriTable = HashBasedTable.create();
        System.out.println("ori:"+ oriTable);
        try {
            Table cloneTable = (Table) cloneObject(oriTable);
            oriTable.put("1", "2", "3");
            System.out.println("clone:"+cloneTable);
            System.out.println("afterOp,ori:"+oriTable);
        } catch (Exception e) {
        }
    }

技术图片

 

 

这样统计数据时候就不会有隐藏的问题了,guava的table使用,参照我的另一篇博客:

guava的Table使用解析

以上是关于深拷贝使用解析的主要内容,如果未能解决你的问题,请参考以下文章

python直接赋值浅拷贝与深拷贝的区别解析

解析js中的深拷贝和浅拷贝

解析js中的深拷贝和浅拷贝

面试之JS深拷贝的实现

面试之JS深拷贝的实现

js中浅拷贝和深拷贝以及深拷贝的实现