深表浅表拷贝

深表拷贝意指堆中的内容也会拷贝,浅表拷贝是指栈中内容拷贝(共享拷贝源的堆指针)。

JDK里面只是提供了浅拷贝,比如System.array.copy就是一例。如果想要实现深度拷贝需要将对象进行序列化,然后再进行反序列化获取对象,此时是深度拷贝。

但是既然JDK里面没有提供深度拷贝,那也意味着其实深度拷贝应用的场景也不是很多。比如我们碰到了一个例子:某个List是共享出去的多线程不安全,此时会有定时任务List进行遍历,然后将满足条件的元素进行删除。分析到此处有两类线程来操作该List:定时任务以及用户程序;实现机制是通过CopyOnWrite对象来对List内容进行浅表拷贝,获取一个新的栈对象,然后,发现不满足条件的,对原List进行删除。这样就避免了遍历删除异常。

其实采用Iterator的方式可以实现边遍历,边删除;两个线程对同时对一个队列又读又写还是不靠谱,现在各自操作各自的队列,影响最小。

时间: 2024-09-29 03:47:36

深表浅表拷贝的相关文章

设计模式概要

设计模式概要 本文学习自程杰兄的大话设计模式所记心得,建议各位看官去看看这一本书.本文留楼主日后回忆时阅读使用 简单工厂模式 把对象的获取放到工厂中,可以减少依赖.对类进行使用继承.使用父类去获取,在需求变更的时候,需要改变的地方只需要加一个子类和工厂中的逻辑.不会对表现层(客户端)有任何的变更,这无疑降低了依赖关系.对后续的迭代和需求变更可以从容应对. 就像是 人(表现层)   超市(工厂)  果园(业务实现) 我们要吃的水果只然是果园中生产出来的,但是如果每次想要吃水果都要去果园采摘的话,这

谈谈设计模式~原型模式(Prototype)

返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据. 从原型模式的概念中,我们可以看到,在这个模式里,拷贝是个很重要的概念,即在不创建对象的情况下,返回一个已有对象,这就是拷贝去实现的,在面向对象的编程世界里,拷贝分为浅拷

NET设计模式 第二部分 创建型模式(5):原型模式(Prototype Pattern)

原型模式(Prototype Pattern) ——.NET设计模式系列之六 Terrylee,2006年1月 概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构.这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适.那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化? 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 结构图 Prototype模式结构图 生活中的例子 Pr

.NET设计模式(6):原型模式(Prototype Pattern)(转)

概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构.这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适.那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化? 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 结构图 Prototype模式结构图 生活中的例子 Prototype模式使用原型实例指定创建对象的种类.新产品的原型通常是先于全部产品建立的,这样的原型是被动的,并不

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

首先我有一个自定义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

java深浅拷贝

转载:http://atjava.iteye.com/blog/1722501 首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制  为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象,对象A1和对象A2  对象A进行浅拷贝后,得到对象B但是对象A1和A2并没有被拷贝  对象A进行深拷贝,得到对象B的同时A1和A2连同它们的引用也被拷贝  在理解了深拷贝和浅拷贝后,我们来看看Java的深拷贝和浅拷

PHP拷贝目录下的所有文件

//目录拷贝函数到任意目录function dir1($filename,$dest){ static $dirname; $dirname.=$dest; //连接头(第一层目录) static $dir; //中间变量 if(file_exists($filename)){ //如果文件存在 if(is_dir($filename)){ //如果是目录,则先创建目录然后遍历 $dirnames=basename($filename); //取最后的目录或者文件名,链接到要转移到的第一层目录

C# 备份、还原、拷贝远程文件夹

最近一直都很忙,非常抱歉好久没有写过博客了.最近遇到拷贝远程文件的一些工作,比如我们发布的web站点的时候,开发提供一个zip压缩包,我们需要上传到远程的服务器A,然后在部署(文件拷贝)到远程环境B和C,ABC都在一个局域网里面. 首先我们需要一个工具类来转换文件路径,本地地址与远程地址的转换 比如192.168.0.1上的D:\test 转换 为\\192.168.0.1\D$\test,文件路径的拼接, public class PathUtil { public static string

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<