java List复制:浅拷贝与深拷贝
来源:互联网 发布:户口本查询软件 编辑:程序博客网 时间:2024/05/16 01:48
List浅拷贝
众所周知,list本质上是数组,而数组的是以地址的形式进行存储。
如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。
几种浅拷贝
1、遍历循环复制
List<Person> destList=new ArrayList<Person>(srcList.size()); for(Person p : srcList){ destList.add(p); }
2、使用List实现类的构造方法
List<Person> destList=new ArrayList<Person>(srcList);
3、使用list.addAll()方法
List<Person> destList=new ArrayList<Person>(); destList.addAll(srcList);
4、使用System.arraycopy()方法
Person[] srcPersons=srcList.toArray(new Person[0]); Person[] destPersons=new Person[srcPersons.length]; System.arraycopy(srcPersons, 0, destPersons, 0, srcPersons.length);
测试及结果
printList(destList); //打印未改变B之前的A srcList.get(0).setAge(100);//改变B printList(destList); //打印改变B后的A//打印结果123-->20 ABC-->21 abc-->22 123-->100 ABC-->21 abc-->22
List深拷贝
如图,深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响。
深拷贝的方法
1.使用序列化方法
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); //调用该方法
2.clone方法
public class A implements Cloneable { public String name[]; public A(){ name=new String[2]; } public Object clone() { A o = null; try { o = (A) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return o; } } for(int i=0;i<n;i+=){copy.add((A)src.get(i).clone());}
Java对对象和基本的数据类型的处理是不一样的。在Java中用对象的作为入口参数的传递则缺省为”引用传递”,也就是说仅仅传递了对象的一个”引用”,这个”引用”的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。 除了在函数传值的时候是”引用传递”,在任何用”=”向对象变量赋值的时候都是”引用传递”。
测试及结果
printList(destList); //打印未改变B之前的A srcList.get(0).setAge(100);//改变B printList(destList); //打印改变B后的A123-->20 ABC-->21 abc-->22 123-->20 ABC-->21 abc-->22
在浅复制的情况下,源数据被修改破坏之后,使用相同引用指向该数据的目标集合中的对应元素也就发生了相同的变化。因此,在需求要求必须深复制的情况下,要是使用上面提到的方法,请确保List中的T类对象是不易被外部修改和破坏的。
参考:
http://blog.csdn.net/lian_1988/article/details/45970927
http://blog.sina.com.cn/s/blog_605f78830102uy6x.html
0 0
- java List复制:浅拷贝与深拷贝
- Java中关于list的深拷贝与浅拷贝
- Java中深拷贝与浅拷贝
- JAVA中深拷贝与浅拷贝
- java中深拷贝与浅拷贝。
- Java深拷贝与浅拷贝原理
- Java 数组 浅拷贝与深拷贝
- Java 数组 浅拷贝与深拷贝
- java中的深拷贝与浅拷贝
- Java 深拷贝与浅拷贝
- java浅拷贝与深拷贝
- JAVA中浅拷贝与深拷贝
- java中浅拷贝与深拷贝
- Java深拷贝与浅拷贝详解
- java深拷贝与浅拷贝
- [Java基础] 深拷贝与浅拷贝
- Java中的浅拷贝与深拷贝
- java的深拷贝与浅拷贝
- docker进入后台运行的容器
- 【腾讯优测干货分享】微信小程序之自动化亲密接触
- 62. Unique Paths
- c/c++ CString 转码编码解码
- stl的string的典型操作_初始化_遍历_连接_和字符指针转化_查找替换_删除_插入_常用算法
- java List复制:浅拷贝与深拷贝
- js 操作数组的方法
- 浮点数与字节数据的转换
- Java专家系列:CPU Cache与高性能编程
- 关于Objdump指令的解释
- Retrofit2.0起步篇
- Java对象的序列化与反序列化
- 用C语言画个心
- 数据结构实验之串一:KMP简单应用