首页 > 技术文章 > 深拷贝使用解析

superchong 2020-01-07 19:23 原文

一,问题分析

  在实际开发过程中,遇到过统计相关的问题,对一个实体类中的数据进行合计,或按照某一函数进行过滤或者累计,由于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使用解析

推荐阅读