智能摘要文章源自JAVA秀-https://www.javaxiu.com/41043.html
点击上方"Java基基",选择"设为星标"做积极的人,而不是积极废人!由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/41043.html
原文约 3856 字 | 图片 8 张 | 建议阅读 8 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/41043.html
List复制:深拷贝和浅拷贝用法及区别
点击关注 ? Java基基 文章源自JAVA秀-https://www.javaxiu.com/41043.html
收录于话题文章源自JAVA秀-https://www.javaxiu.com/41043.html
#Java基基文章源自JAVA秀-https://www.javaxiu.com/41043.html
307个文章源自JAVA秀-https://www.javaxiu.com/41043.html
点击上方“Java基基”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/41043.html
做积极的人,而不是积极废人!文章源自JAVA秀-https://www.javaxiu.com/41043.html
每天 14:00 更新文章,每天掉亿点点头发...文章源自JAVA秀-https://www.javaxiu.com/41043.html
文章源自JAVA秀-https://www.javaxiu.com/41043.html 源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/41043.html
原创 | Java 2021 超神之路,很肝~文章源自JAVA秀-https://www.javaxiu.com/41043.html
中文详细注释的开源项目文章源自JAVA秀-https://www.javaxiu.com/41043.html
RPC 框架 Dubbo 源码解析文章源自JAVA秀-https://www.javaxiu.com/41043.html
网络应用框架 Netty 源码解析文章源自JAVA秀-https://www.javaxiu.com/41043.html
消息中间件 RocketMQ 源码解析文章源自JAVA秀-https://www.javaxiu.com/41043.html
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析文章源自JAVA秀-https://www.javaxiu.com/41043.html
作业调度中间件 Elastic-Job 源码解析文章源自JAVA秀-https://www.javaxiu.com/41043.html
分布式事务中间件 TCC-Transaction 源码解析文章源自JAVA秀-https://www.javaxiu.com/41043.html
Eureka 和 Hystrix 源码解析文章源自JAVA秀-https://www.javaxiu.com/41043.html
Java 并发源码文章源自JAVA秀-https://www.javaxiu.com/41043.html
来源:blog.csdn.net/demonliuhui/文章源自JAVA秀-https://www.javaxiu.com/41043.html
article/details/54572908文章源自JAVA秀-https://www.javaxiu.com/41043.html
List浅拷贝文章源自JAVA秀-https://www.javaxiu.com/41043.html
List深拷贝文章源自JAVA秀-https://www.javaxiu.com/41043.html
List浅拷贝
文章源自JAVA秀-https://www.javaxiu.com/41043.html
图片文章源自JAVA秀-https://www.javaxiu.com/41043.html
众所周知,list本质上是数组,而数组的是以地址的形式进行存储。文章源自JAVA秀-https://www.javaxiu.com/41043.html
如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。文章源自JAVA秀-https://www.javaxiu.com/41043.html
造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。文章源自JAVA秀-https://www.javaxiu.com/41043.html
几种浅拷贝
1、遍历循环复制文章源自JAVA秀-https://www.javaxiu.com/41043.html
List<Person> destList=new ArrayList<Person>(srcList.size());for(Person p : srcList){ destList.add(p);}
2、使用List实现类的构造方法文章源自JAVA秀-https://www.javaxiu.com/41043.html
List<Person> destList=new ArrayList<Person>(srcList);
3、使用list.addAll()方法文章源自JAVA秀-https://www.javaxiu.com/41043.html
List<Person> destList=new ArrayList<Person>();destList.addAll(srcList);
4、使用System.arraycopy()方法文章源自JAVA秀-https://www.javaxiu.com/41043.html
Person[] srcPersons=srcList.toArray(new Person[0]);Person[] destPersons=new Person[srcPersons.length];System.arraycopy(srcPersons, 0, destPersons, 0, srcPersons.length);
测试及结果
printList(destList); //打印未改变B之前的AsrcList.get(0).setAge(100);//改变BprintList(destList); //打印改变B后的A//打印结果123-->20ABC-->21abc-->22123-->100ABC-->21abc-->22
推荐下自己做的 Spring Boot 的实战项目:文章源自JAVA秀-https://www.javaxiu.com/41043.html
https://github.com/YunaiV/ruoyi-vue-pro文章源自JAVA秀-https://www.javaxiu.com/41043.html
List深拷贝
文章源自JAVA秀-https://www.javaxiu.com/41043.html
图片文章源自JAVA秀-https://www.javaxiu.com/41043.html
如图,深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响。文章源自JAVA秀-https://www.javaxiu.com/41043.html
深拷贝的方法
1.使用序列化方法文章源自JAVA秀-https://www.javaxiu.com/41043.html
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方法文章源自JAVA秀-https://www.javaxiu.com/41043.html
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语言中的指针引用是一样的。文章源自JAVA秀-https://www.javaxiu.com/41043.html
当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。除了在函数传值的时候是”引用传递”,在任何用”=”向对象变量赋值的时候都是”引用传递”。文章源自JAVA秀-https://www.javaxiu.com/41043.html
测试及结果
printList(destList); //打印未改变B之前的AsrcList.get(0).setAge(100);//改变BprintList(destList); //打印改变B后的A123-->20ABC-->21abc-->22123-->20ABC-->21abc-->22
在浅复制的情况下,源数据被修改破坏之后,使用相同引用指向该数据的目标集合中的对应元素也就发生了相同的变化。文章源自JAVA秀-https://www.javaxiu.com/41043.html
因此,在需求要求必须深复制的情况下,要是使用上面提到的方法,请确保List中的T类对象是不易被外部修改和破坏的。文章源自JAVA秀-https://www.javaxiu.com/41043.html
- END -文章源自JAVA秀-https://www.javaxiu.com/41043.html
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:文章源自JAVA秀-https://www.javaxiu.com/41043.html
文章源自JAVA秀-https://www.javaxiu.com/41043.html
已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/41043.html
文章源自JAVA秀-https://www.javaxiu.com/41043.html
文章源自JAVA秀-https://www.javaxiu.com/41043.html
文章源自JAVA秀-https://www.javaxiu.com/41043.html
文章源自JAVA秀-https://www.javaxiu.com/41043.html
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/41043.html
提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/41043.html
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/41043.html
文章源自JAVA秀-https://www.javaxiu.com/41043.html
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)文章源自JAVA秀-https://www.javaxiu.com/41043.html
阅读原文文章源自JAVA秀-https://www.javaxiu.com/41043.html

评论