以下文章来源方志朋的博客,回复”666“获面试宝典

  作者:DeMonnnnnn

  blog.csdn.net/demonliuhui/article/details/54572908

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

热门内容:MyBatis-Plus,看这一篇就够了!抖音服务器带宽有多大,才能供上亿人同时刷?这玩意比ThreadLocal叼多了,吓得我赶紧分享出来。高并发下如何保证接口的幂等性最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

List复制:深拷贝和浅拷贝用法及区别相关推荐

  1. 面试官:深拷贝与浅拷贝有啥区别?

    文章目录 1.前言 2.基本类型的拷贝 3.引用类型的拷贝 3.1 关于引用类型的浅拷贝 3.2 关于引用类型的深拷贝 1.前言 首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在 ...

  2. 深拷贝和浅拷贝有什么区别?怎么实现深拷贝和浅拷贝?

    一.浅拷贝 浅拷贝,指的是创建新的对象,这个对象有着原始数据属性值的一份精确拷贝 如果属性是基本类型,拷贝的就是基本类型的值.如果属性是复杂类型,拷贝的就是内存地址 下面简单实现一个浅拷贝 funct ...

  3. python教程:深拷贝与浅拷贝的具体区别在哪里

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...

  4. C++深拷贝与浅拷贝以及写时复制

    深拷贝和浅拷贝的优缺点 看了深拷贝,浅拷贝优缺点,我们知道浅拷贝效率高,但涉及到指针引用等会涉及到指针的多次释放导致悬挂指针.深拷贝,不会造成指针悬挂的问题,但会浪费空间以及效率较低的问题. 下面看下 ...

  5. C++深拷贝与浅拷贝的区别-简单易懂

    C++深拷贝与浅拷贝的区别-简单易懂 介绍 浅拷贝就比如像引用类型,而深拷贝就比如值类型. 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同).对其中任何一个对象的改动都会影响另 ...

  6. 【C++面试问答】搞清楚深拷贝与浅拷贝的区别

    问题 深拷贝和浅拷贝的区别是面试中的常见问题之一,对于不同的编程语言,这个问题的回答可能稍有差别,下面我们就来探索一下它们之间的异同吧. 先来看看在JavaScript对象的深拷贝与浅拷贝的区别: 浅 ...

  7. C++ 构造函数、复制构造函数,拷贝构造函数(深拷贝、浅拷贝)

    文章目录 前言 一.什么是构造函数? 二.构造函数的分类 复制构造函数 复制构造函数被调用的三种情况 复制构造函数在以下三种情况下会被调用. 三.拷贝构造函数的分类 深.浅拷贝构造函数的区别 示例代码 ...

  8. c++深拷贝和浅拷贝

    C++中类的拷贝有两种:深拷贝,浅拷贝:当出现类的等号赋值时,即会调用拷贝函数 一:两个的区别 1 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数--即浅拷贝,它能够完成成员的一一复制.当 ...

  9. 深拷贝与浅拷贝~动态内存释放有关

    浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如: class A{ public: A(int ...

最新文章

  1. 2021年大数据Spark(四十二):SparkStreaming的Kafka快速回顾与整合说明
  2. 安装gym库_强化学习Gym库学习实践(一)
  3. 著名数据库状告分支,法院:100%开源为虚假宣传!
  4. 药房管理(信息学奥赛一本通-T1075)
  5. 社交媒体广告看不出来?Instagram加标签让你一目了然
  6. vue中的watch监听数据变化
  7. Java和c++的栈和队列的异同
  8. php 汉字拼音字典排序,按拼音排序的小技巧
  9. 【LeetCode】求中位数(数据流、滑动窗口、两个正序数组)
  10. 一维数组实验题:大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选
  11. 解决手机WiFi(电脑热点)一直正在获取IP地址或无法访问互联网【与网上其他方法不同】
  12. 安卓应用市场互相抓取app包
  13. matlab画无坐标双曲正割形状并填充颜色
  14. 51 PWM调速蓝牙小车
  15. 【OpenCV】生成透明的PNG图像
  16. 2023年西南交通大学马克思主义理论考研上岸前辈备考经验
  17. 科技云报道:腾“云”驾“数”,制造业数字化升级进行时
  18. PXC高可用集群(MySQL)
  19. 【已解决】pycharm 终端无法激活conda环境
  20. 逆变器阻抗扫描 扫频法 阻抗扫描 阻抗建模验证

热门文章

  1. 暑期集训2:ACM基础算法 练习题A:CF-1008C
  2. UNL(Ubiquitous Navigation Lab)
  3. Bzoj1123 Blockade
  4. 由“公共类”看出的一些东西
  5. 【Linux笔记(002) 】-- centos7 文档操作基本命令
  6. 图论--欧拉路,欧拉回路(小结)
  7. 在tomcat中用jndi配置数据源启动java web程序
  8. Python Socket编程基础篇
  9. Oracle基础 动态SQL语句
  10. Numpy入门教程:08. 集合操作