浅表复制(克隆)和深表复制(克隆)

首先我有一个自定义User类有一个age属性,此时:

ArrayList list=new ArrayList();
       User user=new User();
      user.setAge(10);
       list.add(user);  
     //克隆,浅表复制,复制的是地址
       ArrayList list2=(ArrayList) list.clone();
       user=(User) list.get(0);
       user.setAge(20);

System.out.println("list2的值"+((User) list2.get(0)).getAge());

此时list和list2的.get(0)共用user地址,不管哪一个修改了age值,集合里存储的数据最终也都会跟着改变;

如果不想共用一个user,这时就用到了深表克隆:

深表克隆集合里的自定义类必须实现序列化:public class User implements Serializable {}

此时写一个方法:

private static ArrayList deepClone(ArrayList list) throws IOException, ClassNotFoundException {

//写入流
  ByteArrayOutputStream byteout=new ByteArrayOutputStream();
  ObjectOutputStream out=new ObjectOutputStream(byteout);
  out.writeObject(list);

//输出流到内存
  ByteArrayInputStream byteIn=new ByteArrayInputStream(byteout.toByteArray());
  ObjectInputStream in=new ObjectInputStream(byteIn);
  ArrayList dest=(ArrayList)in.readObject();
  return dest;
 }

用这个方法后,两个list内存地址就不一样了;

ArrayList list=new ArrayList();
       User user=new User();
      user.setAge(10);
       list.add(user);

list2=deepClone(list);

user=(User) list2.get(0);
       System.out.println(user.getAge());
       user.setAge(30);
       System.out.println("深表复制后......................");

System.out.println("list的值"+((User) list.get(0)).getAge());
 System.out.println("list2的值"+((User) list2.get(0)).getAge());

这样子第一个list输出10,第二个输出30;

时间: 2024-08-16 11:53:36

浅表复制(克隆)和深表复制(克隆)的相关文章

MySQL 主从复制、主主复制、半同步复制

MySQL 复制 =============================================================================== 概述: =============================================================================== MySQL Replication:   1.主从复制的目的和架构 ★Master/Slave(主/从) Master: write/read Slave

数据库复制(一)--复制介绍

介绍: 在运行着的数据库驱动的应用程序中,SQL复制能解决许多问题.由于发送/订阅的模式不是十分容易理解,复杂的脚本语言和监视复制系统也是需要一定的思想在里面.希望在接下来的几个章节中能尽量将基本原理和操作阐述的详细完整些,便于大家理解. 在SQLServer中,复制就是产生或复制数据:比如你需要去创建一个你数据的副本,或者复制一个那份数据的改变,SQL复制就派上用场了. 复制的副本可以在同一个数据库中也可以在远程的分隔的服务器上. 副本与源数据保持实时同步,或者在规定时间间隔内保持同步.单步同

算法题:复制复杂链表之复制连接法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章算法题:复制复杂链表之空间换时间法我们给出了用映射的方法来为新复制的链表中的每个结点设置any指针,本文给出的是<剑指offer>上给出的算法与代码,<剑指offer>上提到该算法的实现三个步骤:        第一步:复制原始链表的任意结点N并创建新结点N',在把N'连接到N的后面:        第二步:设置每个结点的any指针:        第三步:将长链表分成两个链表,一个是原始链表,另外一个就是我们所要求的复制

MySQL数据的主从复制、半同步复制和主主复制详解

一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制.单向.异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环

Java中的深拷贝(深复制)和浅拷贝(浅复制)

深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复制)和浅拷贝(浅复制),我们还是要给予足够的重视,因为有时这两个概念往往会给我们带来不小的困惑. 浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象.深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象.举例来说更加清楚:对象A1中包含对B1的引用

mysql主从复制、主主复制与半同步复制的实现

1.主从复制 实验环境:2台装有mariadb的centos6,ip地址分别为192.168.198.203(master ),192.168.194.90(slave) 测试:在master上新建一个数据库,查看slave中是否同步 ##################################################### master上的配置: a. 启动二进制日志:在mariadb的配置文件/etc/my.cnf中添加 [mysqld] log_bin=mysql-bin

MySQL主从复制、半同步复制和主主复制

同步,异步,半同步复制的比较: 同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕.缺点:完成一个事务可能会有很大的延迟. 异步复制:当Slave准备好才会向Master请求binlog.缺点:不能保证一些事件都能够被所有的Slave所接收. 半同步复制:半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录.它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交.

mariadb-10实现半同步复制及SSL安全复制

一.关于复制的相关问题 1.异步复制解决了那些问题 复制解决的基本问题是让一台服务器的数据和另外的服务器保持同步,可以位于不同的网络拓扑中,对整台服务器的特定的数据库,甚至特定的表进行复制. 基于语句复制和基于行复制,都是通过记录主服务器的二进制日志,并在从服务器上进行重放(replay)完成复制,它们都是异步进行的. mariadb或mysql复制大部分都是向后兼容的.这意味着版本较新的服务器可以是版本老的服务器的从服务器.复制通常不会大幅增加服务器的开销,它需要主服务器启用二进制日志.复制对

MariaDB数据库主从复制、双主复制、半同步复制、基于SSL的安全复制实现及其功能特性介绍

一.复制概述 MariaDB/MySQL内建的复制功能是构建大型,高性能应用程序的基础.将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将MySQL的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位