List深拷贝和浅拷贝--本人自用过的绝对简单且ok的两种方法
程序员文章站
2024-01-26 10:20:16
...
关于深拷贝和浅拷贝
此类文章很多,不再过多赘述。以下说下个人的简单理解:
- 浅拷贝:拷贝对象的引用
- 深拷贝:拷贝对象的地址
场景描述:
在做项目的过程中,本人遇到了这样一个情况;本人做“绩效评估”相关的系统时,当一级审批,与二级审批的角色不同,但是俩个角色恰好对应同一个人。因为两级审批权重不同,于是就要对这种的情况,审批人打一次分,要保存两次打分记录(打分记录为多条),以保证不影响后续的计算。而此时就需要用到深拷贝。
1.浅拷贝:
如下面这样写,把目标list作为参数传入,就是浅拷贝,而实际上这种并没有复制内存地址,如果改变list中值,原对象也会随之改变。
List<AssessmentItemResultPO> newResList = new ArrayList<AssessmentItemResultPO>(resultPOList);
2.深拷贝:
使用序列化方法
List<AssessmentItemResultPO> newResList = new ArrayList<AssessmentItemResultPO>();
try {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(resultPOList);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
newResList = (List<AssessmentItemResultPO>) in.readObject();
} catch (Exception e) {
e.printStackTrace();
}
总结:
可将上面的深拷贝方法弄成个工具类,如下:
public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
}
调用:
List<Person> destList=deepCopy(srcList);
上一篇: 初识jQuery
下一篇: Tinker爬坑之路