java List复制:浅拷贝与深拷贝
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
java List复制:浅拷贝与深拷贝相关推荐
- 【转】JAVA中的浅拷贝和深拷贝
原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...
- Java中的浅拷贝与深拷贝
一.引用拷贝与对象拷贝 class Person implements Cloneable{private String name;private int age;...省略get和set方法 pro ...
- java深入理解浅拷贝和深拷贝
文章目录 简介 拷贝接口 使用clone导致的浅拷贝 使用clone的深拷贝 不要overridden clone 总结 简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和 ...
- 夯实Java基础系列28:java里的浅拷贝、深拷贝
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- int** 赋值_Python的赋值、浅拷贝、深拷贝之间的区别
这里用三张图来说清Python的赋值.浅拷贝.深拷贝之间的区别. 补充说明: 1.首先要理解 不可变数据.可变数据类型: 2.对于其他语言(如JAVA)的浅拷贝.深拷贝逻辑相同: 3.下图所描述的数据 ...
- java map to map 拷贝_java复制Map 对象(深拷贝和浅拷贝)
java复制Map 对象(深拷贝和浅拷贝) java复制Map 对象(深拷贝和浅拷贝) 2. 通过 putAll()方法能实现浅拷贝和深拷贝, 使用Map对象只能实现浅拷贝 public static ...
- Java基础—复制之深拷贝与浅拷贝
目录 一.浅拷贝(Shallow Copy) 二.深拷贝(Deep Copy) Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去 ...
- java数组深拷贝和浅拷贝_java List复制:浅拷贝与深拷贝
Java的拷贝可以分为三种:浅拷贝(Shallow Copy).深拷贝(Deep Copy).延迟拷贝(Lazy Copy). 在java中除了基本数据类型之外(int,long,short等),还存 ...
- Java的浅拷贝与深拷贝总结
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- Java提高篇 —— Java浅拷贝和深拷贝
一.前言 我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性能 ...
最新文章
- 数据结构 - 平衡二叉树
- 算法入门开灯问题,新做法
- 电子邮箱里面的服务器,搭建电子邮件服务器
- 洛谷——P1119 灾后重建
- 7-3 树的同构 (25 分)(思路加详解)来呀baby!!!!!!!!
- 微信小程序 request请求封装
- 数据库过滤操作中 != 或者 指定操作数并不能改匹配到NULL值
- php ci base url,CodeIgniter中base_url问题
- java 创建bean_java – 使用spring按需创建bean
- 算法 判断多个点是否在同一圆周线上_广州灵活计费自动出盘机技术方案大盘点...
- 图像相似度对比分析软件,图像相似度对比分析法
- C语言三种形式编九九乘法表,C语言九九乘法表(五种输出形式)
- 软考之网络工程师准备
- js 京东关闭广告 pink
- 分享材料(不断更新)
- PCL中点云特征描述与提取精通级实例解析
- 网站识别Windows AD 域账号,并自动登录
- CSGO开箱C++小程序。(229行)
- 天地超云高温一体机的耐热秘诀
- Shell编程规范与变量(shell编程规范,执行脚本文件的四种方式,管道符号与重定向,shell变量的作用于类型)