浅拷贝和深拷贝(java)
拷贝:多用于prototype原型模式的复制。
数据库连接池,将properties中的jdbc信息(user/password/url/port)等获取后赋值给jdbcData对象,然后将对象复制n份,连接数据库,创建连接池。
浅拷贝:
复制对象指向,不复制值,除过基本类型.当有对象在里面时,修改原对象的值,会导致clone后的内容值也发生变化。因为指向不变。
如果一个对象中没有引用其它对象,String不算。可以使用浅拷贝。因为String每次会新创建而不会破坏克隆后对象的引用。
*** 浅拷贝clone要implements Cloneable接口
深拷贝:
对象指向及其值一起拷贝,(如果一个对象中引用了另一个对象,而另一个对象中没有再引用其它内容,可在拷贝时,将内部对象重新拷贝再赋给当前对象)。
要通过输出流输入流的形式对象需要序列化操作。
**** 深拷贝clone要implements Serializable接口,其内部对象也要串型化
以下为创建的示例:
/**
* 原型模式要实现克隆,必须实现Cloneable
* 拷贝分深拷贝和
* 浅拷贝:复制对象指向,不复制值,除过基本类型.当有对象在里面时,修改原对象的值,会导致clone后的内容值也发生变化。因为指向不变。
* 如果一个对象中没有引用其它对象,String不算。可以使用浅拷贝。因为String每次会新创建而不会破坏克隆后对象的引用。
* 浅拷贝clone要implements Cloneable接口
* 深拷贝:对象指向及其值一起拷贝,(如果一个对象中引用了另一个对象,而另一个对象中没有再引用其它内容,可在拷贝时,将内部对象重新拷贝再赋给当前对象)。要通过输出流输入流的形式
* 对象需要序列化操作。
* 深拷贝clone要implements Serializable接口,其内部对象也要序列号
*
* @author DennyZhao
* @date 2017年6月13日
* @version 1.0
*/
public class PrototypeFactory implements Cloneable, Serializable{ /**
* 自动生成序列号
*/
private static final long serialVersionUID = 1416969741781583897L;
private String name;
private String englishName;
private String nickName;
private int age;
private AnimalFactory animal; public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getEnglishName() {
return englishName;
}
public void setEnglishName(String englishName) {
this.englishName = englishName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public AnimalFactory getAnimal() {
return animal;
}
public void setAnimal(AnimalFactory animal) {
this.animal = animal;
}
@Override
public String toString() {
return "PrototypeFactory [name=" + name + ", englishName="
+ englishName + ", nickName=" + nickName + ", age=" + age
+ ", animal=" + animal + "]";
} /**
* 浅拷贝
*/
public PrototypeFactory clone() throws CloneNotSupportedException{
return (PrototypeFactory)super.clone();
} /**
* 这种拷贝只能针对对象内的对象内都是基本数据类型才可以。且内部对象也具有克隆方法
*/
public PrototypeFactory clone2() throws CloneNotSupportedException{
PrototypeFactory pro = (PrototypeFactory)super.clone();
//pro.animal = (PrototypeFactory)pro.animal.clone;
return pro;
} /**
* 深拷贝
*/
public PrototypeFactory deepClone(){
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
PrototypeFactory pro = null;
try {
oos = new ObjectOutputStream(os);
oos.writeObject(this);
ois = new ObjectInputStream(new ByteArrayInputStream(os.toByteArray()));
pro = (PrototypeFactory)ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return pro;
} }
ProtoTypeFactory
测试示例:
public class TestProtoType {
public static void main(String[] args) throws CloneNotSupportedException {
//原型模式
PrototypeFactory protoFactory = new PrototypeFactory();
protoFactory.setEnglishName("DennyZhao");
protoFactory.setName("~~~~强~~");
protoFactory.setNickName("~~王~~");
protoFactory.setAge(10);
Rabit rabit22 = new Rabit();
rabit22.getHeader("A", 2, "B");
protoFactory.setAnimal(rabit22);
PrototypeFactory cloneProto = protoFactory.clone();
PrototypeFactory cloneDeep = protoFactory.deepClone();
System.out.println("protoFactory:--" + protoFactory.toString());
System.out.println("cloneProto:---" + cloneProto.toString());
System.out.println("cloneDeep:---" + cloneDeep.toString());
// 修改原数据参数
protoFactory.setEnglishName("Denny....");
protoFactory.setAge(8);
((Rabit)protoFactory.getAnimal()).getHeader("C", 3, "D");
System.out.println("2protoFactory:--" + protoFactory.toString());
System.out.println("2cloneProto:---" + cloneProto.toString());
System.out.println("2cloneDeep:---" + cloneDeep.toString());
System.out.println("3protoFactory---" + ((Rabit)protoFactory.getAnimal()).getHeader());
System.out.println("3cloneProto---" + ((Rabit)cloneProto.getAnimal()).getHeader());
System.out.println("3cloneDeep---" + ((Rabit)cloneDeep.getAnimal()).getHeader());
}
TestPrototype
运行结果:
protoFactory:--PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@a57993]
cloneProto:---PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@a57993]
cloneDeep:---PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@17327b6]
2protoFactory:--PrototypeFactory [name=~~~~强~~, englishName=Denny...., nickName=~~王~~, age=8, animal=pattern.creation.factory.animal.Rabit@a57993]
2cloneProto:---PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@a57993]
2cloneDeep:---PrototypeFactory [name=~~~~强~~, englishName=DennyZhao, nickName=~~王~~, age=10, animal=pattern.creation.factory.animal.Rabit@17327b6]
3protoFactory---C3D
3cloneProto---C3D
3cloneDeep---A2B
Result
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
内容借鉴:(Java中的深拷贝(深复制)和浅拷贝(浅复制))http://www.cnblogs.com/shuaiwhu/archive/2010/12/14/2065088.html
以上,为个人总结,如有写的不当之处,还望指正。
-----------DennyZhao
浅拷贝和深拷贝(java)的更多相关文章
- Java的浅拷贝与深拷贝
Java的浅拷贝与深拷贝 Java中,所有的类都继承Object,Object中有clone方法,它被声明为了 protected ,所以我们但是如果要使用该方法就得重写且声明为public,必须在要 ...
- 【转】JAVA中的浅拷贝和深拷贝
原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...
- 浅析java的浅拷贝和深拷贝
Java中任何实现了Cloneable接口的类都可以通过调用clone()方法来复制一份自身然后传给调用者.一般而言,clone()方法满足: (1) 对任何的对象x,都有x.clone( ...
- Java 浅拷贝和深拷贝的理解和实现方式
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- java 浅拷贝和深拷贝 对象克隆clone
分一下几点讨论: 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 一:为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗? 答案是:克隆的对象可能包 ...
- Java对象的浅拷贝和深拷贝&&String类型的赋值
Java中的数据类型分为基本数据类型和引用数据类型.对于这两种数据类型,在进行赋值操作.方法传参或返回值时,会有值传递和引用(地址)传递的差别. 浅拷贝(Shallow Copy): ①对于数据类型是 ...
- 浅拷贝和深拷贝(谈谈java中的clone)
clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有 ...
- Java中的clone方法-理解浅拷贝和深拷贝
最近学到Java虚拟机的相关知识,更加能理解clone方法的机制了 java中的我们常常需要复制的类型有三种: 1:8种基本类型,如int,long,float等: 2:复合数据类型(数组): 3:对 ...
- java List复制:浅拷贝与深拷贝
Java的拷贝可以分为三种:浅拷贝(Shallow Copy).深拷贝(Deep Copy).延迟拷贝(Lazy Copy). 在java中除了基本数据类型之外(int,long,short等),还存 ...
随机推荐
- springboot(整合多数据源demo,aop,定时任务,异步方法调用,以及获取properties中自定义的变量值)
有这么一个需求 每个部门,需要操作的数据库不同,A部门要将数据放test数据库,B 部门数据 要放在test1数据库 同一个项目 需要整合 多个数据源 上传个demo 方便自己以后回看!!!!!!!! ...
- HDOJ 2003 求绝对值
#include<cstdio> #include<cmath> int main() { double a; while (scanf_s("%lf", ...
- 第一天课程:第一个python程序print say hello
print("Hello World") linux下要加可执行权限 chmod 755 hello.py 权限755,7=4+2+1,4是读,2是写,1是执行,第一个7代表用户, ...
- hadoop ha环境下的datanode启动报错java.lang.NumberFormatException: For input string: "10m"
hadoop ha环境启动start-dfs.sh的时候datanode启动不了,并且报错. [hadoop@datanode2 ~]$ cat /home/hadoop/hadoop-2.7.3/l ...
- 在线学习和在线凸优化(online learning and online convex optimization)—在线分类问题2
紧接上文,我们讲述在线分类问题 令,为0-1损失,我们做出如下的简化假设: 学习者的目标是相对于hypotheses set: H具有low regret,其中H中的每个函数是从到{0,1}的映射,并 ...
- Find the peace with yourself
The purpose of being mature is to find the real calm and peace with yourself. Or you can say the tur ...
- CRM 2016 IFrame_A嵌入 EXT.net 页面 a.aspx,刷新另一IFrame_B嵌入 b.aspx gird.
说白了就是一个IFrame页面,执行另一IFrame页面的函数. a.aspx JS: parent.Xrm.Page.getControl("IFRAME_B").getObj ...
- c# 未能加载文件或程序集
最近做项目时碰到这个问题了,goole.百度了半天,整理了以下几种可能: DLL文件名与加载时的DLL文件名不一致, DLL文件根本不存在,即出现丢失情况, 加载DLL路径错误,即DLL文件存在,但加 ...
- HDFS分布式文件系统
hadoop致力于构建在廉价的商用服务器上 多副本存储策略(副本数存多少合适) 常见是数据访问方式:流式数据访问(更适合大数据的访问) 随机数据访问(更适合传统的关系型数据库的访问)
- 分布式系统的Raft算法
好东西~~ 英文动画演示Raft 过去, Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑. 来自Stan ...