深拷贝使用解析
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使用,参照我的另一篇博客:
以上是关于深拷贝使用解析的主要内容,如果未能解决你的问题,请参考以下文章