java对象的拷贝
来源:互联网 发布:093b核潜艇相关数据 编辑:程序博客网 时间:2024/06/04 18:09
设计模式中的原型模型主要是针对构造复杂对象提出来的,当构造函数需要大量的操作时构造一个类的对象会耗费大量的资源。
本文:http://www.cnblogs.com/xudong-bupt/p/3506450.html
1.C++中的解决方案
在C++中默认提供了copy构造函数、copy assignment操作符,可以实现对象的内存拷贝,节省了新构造对象的开销,其中的实现机制就是操作符重载。C++代码如下:
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 5 class Point{ 6 public: 7 Point(const int _x,const int _y):x(_x),y(_y){} 8 9 int x;10 int y;11 };12 13 int main(){14 Point p1(5,5);15 Point p2=p1; ///或者Point p2(p1);16 p2.x=6;17 18 cout<<"p1.x="<<p1.x<<endl;19 cout<<"p2.x="<<p2.x<<endl;20 return 0;21 }
代码中使用了C++默认提供的copy构造函数或者copy assignment操作符,从内存拷贝新建对象,速度快。
执行结果:
2.java中的解决方案
2.1 Java中没有提供“=”的copy assignment操作符等
Java中的“=”对于对象类型是共享对象的引用,而不是复制对象。对其中一个引用修改数据,其他引用就同时能够看到。如下图所示:
代码如下:
1 public class TestClone{ 2 public static void main(String[] arg){ 3 Point p1=new Point(5,5); 4 5 Point p2=p1; 6 p2.x=10; 7 System.out.println("p1.x="+p1.x); //(10) 8 System.out.println("p2.x="+p2.x); //(10) 9 }10 }11 12 class Point{13 int x;14 int y;15 Point(int _x,int _y){16 this.x=_x;17 this.y=_y;18 }19 }
2.2 Java中提供了Cloneable关键字
Java中提供了Cloneable关键字来标示这个对象是可以拷贝的。Cloneable接口中没有一个方法,只起到标示作用。
clone()方法是Object类提供的方法,只用重写“clone()”方法就能实现对象拷贝。
对象拷贝有分为:深拷贝、浅拷贝。看下面的代码:
1 public class TestClone{ 2 public static void main(String[] arg){ 3 Point p1=new Point(5,5); 4 Point p3=(Point) p1.clone(); 5 p3.y=-10; 6 p3.mes[0]=20; 7 System.out.println("p1.y="+p1.y+",p3.y="+p3.y); 8 System.out.println("p1.mes[0]="+p1.mes[0]+",p3.mes[0]="+p3.mes[0]); 9 }10 }11 12 class Point implements Cloneable{13 int x;14 int y;15 int mes[];16 Point(int _x,int _y){17 this.mes=new int[2];18 this.x=_x;19 this.y=_y;20 this.mes[0]=_x;21 this.mes[1]=_y;22 }23 24 @Override25 public Point clone(){26 Point tt=null;27 try{28 tt=(Point)super.clone();29 //tt.mes=(int[])this.mes.clone(); //深拷贝30 }31 catch(Exception e){ }32 return tt;33 }34 }
注释掉第29行执行结果(浅拷贝):
p1.y=5,p3.y=-10
p1.mes[0]=20,p3.mes[0]=20
不注释掉第29行执行结果(深拷贝):
p1.y=5,p3.y=-10
p1.mes[0]=5,p3.mes[0]=20
深拷贝、浅拷贝区别:Java类中除基本类型(包含String)外其他复杂数据类型的拷贝,必须使用深拷贝。数组,其他类对象的拷贝,都要用到深拷贝。
3.注意
学的编程语言多了,就得注意他们之间的不同。
Java和C/C++的“=”是不同的,java中“=”将类对象的引用加1;C++中由于重载操作符“=”,会拷贝类对象。
- java对象的拷贝
- Java对象的拷贝
- 【Java】对象的拷贝
- java对象的深拷贝浅拷贝
- Java对象的深层拷贝
- Java对象的 深拷贝和浅拷贝
- java对象的浅拷贝和深拷贝
- Java对象的浅拷贝与深拷贝
- java学习笔记-数组,对象的拷贝
- java不同类型对象之间的拷贝
- Java中对象的复制/拷贝
- java对象的序列化和拷贝
- Java编程基础-----对象的深度拷贝
- java中对象的拷贝(克隆)
- java拷贝对象
- Java对象拷贝
- JAVA对象拷贝
- JAVA 对象拷贝
- Java 时间服务器demo之线程池
- javascript深入理解js闭包
- Android性能优化之如何避免Overdraw
- 使用struts2实现文件上传并在上传过程中为文件重新命名
- Android自助餐之Jni(三)动态导入so文件
- java对象的拷贝
- 《笨办法学Python》 第7课手记
- 浅谈ViewHolder
- 不懂Git,别说自己是程序猿–20分钟git快速上手
- HDOJ 1176 免费馅饼 (DP)
- 写出高效清晰Layout布局文件的一些技巧
- Scala 模式匹配下的for循环
- c++实现反射机制
- Android自助餐之Jni(四)在线导入so文件