欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

List深拷贝和浅拷贝--本人自用过的绝对简单且ok的两种方法

程序员文章站 2024-01-26 10:20:16
...

关于深拷贝和浅拷贝

此类文章很多,不再过多赘述。以下说下个人的简单理解:

  1. 浅拷贝:拷贝对象的引用
  2. 深拷贝:拷贝对象的地址

场景描述:
在做项目的过程中,本人遇到了这样一个情况;本人做“绩效评估”相关的系统时,当一级审批,与二级审批的角色不同,但是俩个角色恰好对应同一个人。因为两级审批权重不同,于是就要对这种的情况,审批人打一次分,要保存两次打分记录(打分记录为多条),以保证不影响后续的计算。而此时就需要用到深拷贝。
List深拷贝和浅拷贝--本人自用过的绝对简单且ok的两种方法

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爬坑之路