开门见山的说,List的复制其实是很常见的,List其本质就是数组,而其存储的形式是地址

如图所示,将List A列表复制时,其实相当于A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。

造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。

这也就是List的浅拷贝,其常见的实现方式有如下几种:

浅拷贝

1、遍历循环复制

List destList=new ArrayList(srcList.size());

for(Person p : srcList){

destList.add(p);

}

2、使用List实现类的构造方法

List destList=new ArrayList(srcList);

3、使用list.addAll()方法

List destList=new ArrayList();

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内容一致,但是由于所指向的地址不同,所以改变相互不受影响。

import org.apache.commons.collections.CollectionUtils;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class CopyTest {

public static void main(String[] args) {

List list = new ArrayList<>();

for (int i = 0; i < 10; i++) {

list.add(i);

}

//list深度拷贝

List newList = new ArrayList<>();

CollectionUtils.addAll(newList, new Object[list.size()]);

Collections.copy(newList, list);

newList.set(0, 10);

System.out.println("原list值:" + list);

System.out.println("新list值:" + newList);

}

}

测试结果

原list值:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

新list值:[10, 1, 2, 3, 4, 5, 6, 7, 8, 9]

小结

Java对对象和基本的数据类型的处理是不一样的。在Java中用对象的作为入口参数的传递则缺省为”引用传递”,也就是说仅仅传递了对象的一个”引用”,这个”引用”的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。 除了在函数传值的时候是”引用传递”,在任何用”=”向对象变量赋值的时候都是”引用传递”。

在浅复制的情况下,源数据被修改破坏之后,使用相同引用指向该数据的目标集合中的对应元素也就发生了相同的变化。因此,在需求要求必须深复制的情况下,要是使用上面提到的方法,请确保List中的T类对象是不易被外部修改和破坏的。

mysql浅拷贝_List的复制 (浅拷贝与深拷贝)相关推荐

  1. java map to map 拷贝_java复制Map 对象(深拷贝和浅拷贝)

    java复制Map 对象(深拷贝和浅拷贝) java复制Map 对象(深拷贝和浅拷贝) 2. 通过 putAll()方法能实现浅拷贝和深拷贝, 使用Map对象只能实现浅拷贝 public static ...

  2. mysql浅拷贝_深入理解浅拷贝和深拷贝

    0x01:概述 Java中的对象拷贝 ( Object Copy ) 是指将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.例如,对象 A 和对象 B 都属于类 S,具有属性 a ...

  3. C++深拷贝和浅拷贝(深复制和浅复制)完全攻略

    C++深拷贝和浅拷贝(深复制和浅复制)完全攻略 对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存.例如: class Base{public:Base(): m_a(0), ...

  4. 浅拷贝 python_python中的浅拷贝和深拷贝

    http://python.jobbole.com/82294/ Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介 ...

  5. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝

    在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...

  6. Mysql进阶(2)——组复制

    前言 组复制模型: MySQL组复制是MySQL 5.7.17开始引入的新功能,为主从复制实现高可用功能.它支持单主模型和多主模型两种工作方式(默认是单主模型). 单主模型:从复制组中众多个MySQL ...

  7. mysql 5.6 并行复制_MySQL 5.6并行复制架构

    诚然,MySQL 5.6版本也支持所谓的并行复制,但是其并行只是基于schema的,也就是基于库的.如果用户的MySQL数据库实例中存在多个schema,对于从机复制的速度的确可以有比较大的帮助.My ...

  8. [inside]MySQL 5.7 并行复制实现原理与调优

    MySQL 5.7并行复制时代 众所周知,MySQL的复制延迟是一直被诟病的问题之一,然而在Inside君之前的两篇博客中(1,2)中都已经提到了MySQL 5.7版本已经支持"真正&quo ...

  9. MySQL 5.7 并行复制实现原理与调优

    转载:http://www.innomysql.net/article/16317.html Contents 1 MySQL 5.7并行复制时代 2 MySQL 5.6并行复制架构 3 MySQL ...

最新文章

  1. WMI技术介绍和应用——查询桌面信息
  2. 如何在阿里云上使用Data Lake Analytics分析Table Store数据
  3. 【mysql解决办法】insert into select 想插入的数据如果部分为空怎么办?
  4. 最长公共子序列LCS
  5. telnet用法 测试端口号是否可以使用
  6. 判断元素是否存在(信息学奥赛一本通-T1211)
  7. 修改centos默认启动级别为字符模式
  8. Windows 平台安装 MongoDB
  9. ios 添加条纹背景
  10. 我亦云云——也谈云计算(3)
  11. redis 经典36问
  12. MESOS集群高可用部署
  13. SM3算法的编程实现
  14. 「无捆绑不锁页」极度纯净win10 32位专业版下载地址
  15. js使用canvas画布画太极图案
  16. ios模拟器装ipa包_用iOS模拟器安装App的方法
  17. 车牌识别关键技术-车牌定位
  18. 怎么查找iphone测试的软件,iphone怎么测试跑分 iphone跑分软件使用教程
  19. dhcp、tftp及pxe简介
  20. Typora markdown语法基础教程

热门文章

  1. 机器学习(九)——EM算法
  2. javacore分析工具_Javacore 与 WebSphere Commerce 性能问题之争?谁才是赢家
  3. Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)
  4. 【前端面试】数据类型与类型检测
  5. 10 大方法,让您的客服中心提供更出色的服务
  6. Yii2 主从 数据库
  7. PHPCMS调用相关
  8. 设计模式(5)----模板方法
  9. 电子商务公司的职能架构及基础岗位职能
  10. squid代理服务器详解