Java实现深拷贝和浅拷贝
1.类实现Cloneable才可以进行对象拷贝
2.Cloneable只实现浅拷贝,需要实现深拷贝的必须要重写clone()方法
3.利用反序列化也可以实现深拷贝,但是反序列化耗时较长
n.浅拷贝是指拷贝对象时只拷贝对象本身和其基本变量及引用变量,不拷贝对象中引用指向的对象,深拷贝反之
4.可以浅拷贝的对象类
package deepCopy;
import java.io.Serializable;
public class UserShallowClone implements Cloneable,Serializable{
/**
*
*/
private static final long serialVersionUID = 222;
private int age;
private String name;
private House house;
public UserShallowClone(int age, String name, House house) {
super();
this.age = age;
this.name = name;
this.house = house;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public House getHouse() {
return house;
}
public void setHouse(House house) {
this.house = house;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
5.可以深拷贝的对象类
package deepCopy;
public class UserDeepClone implements Cloneable{
private int age;
private String name;
private House house;
public UserDeepClone(int age, String name, House house) {
super();
this.age = age;
this.name = name;
this.house = house;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public House getHouse() {
return house;
}
public void setHouse(House house) {
this.house = house;
}
@Override
protected Object clone() throws CloneNotSupportedException {
UserDeepClone userNew = (UserDeepClone)super.clone();
userNew.house = (House) house.clone();
return userNew;
}
}
6.House类
package deepCopy;
import java.io.Serializable;
public class House implements Cloneable,Serializable{
/**
*
*/
private static final long serialVersionUID = 33;
private int zipCode;
public House(int zipCode) {
super();
this.zipCode = zipCode;
}
public int getZipCode() {
return zipCode;
}
public void setZipCode(int zipCode) {
this.zipCode = zipCode;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
7.测试类
package deepCopy; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class Test {
public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException
{
//deep copy
long deepClone = System.currentTimeMillis();
House house = new House(1010);
UserDeepClone userDeep = new UserDeepClone(11, "CC", house);
UserDeepClone userDeepCopy = (UserDeepClone) userDeep.clone();
System.out.println("deep copy by cloneable speeds " +(System.currentTimeMillis()-deepClone) + "ms");
System.out.println("Deep Copy----------");
System.out.println("userDeep" + userDeep
+ ",userSDeepCopy=" + userDeepCopy);
System.out.println("userDeep house=" + userDeep.getHouse()
+ ",userDeepCopy house=" + userDeepCopy.getHouse()); System.out.println();
System.out.println("Shallow Copy----------"); //shallow copy
long shallowCopy = System.currentTimeMillis();
UserShallowClone userShallow = new UserShallowClone(12, "CC", house);
UserShallowClone userShallowCopy = (UserShallowClone) userShallow.clone();
System.out.println("shallowCopy spends " + (System.currentTimeMillis()-shallowCopy) + "ms");
System.out.println("userShallow=" + userDeep
+ ",userShallowCopy=" + userDeepCopy);
System.out.println("userShallow house=" + userShallow.getHouse()
+ ",userShallowCopy house=" + userShallowCopy.getHouse());
//反序列化深拷贝
System.out.println();
long deepSer = System.currentTimeMillis();
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(userShallow); ObjectInputStream oi = new ObjectInputStream(new ByteArrayInputStream(bo.toByteArray()));
UserShallowClone userDeepSer = (UserShallowClone) oi.readObject();
System.out.println("deep copy by ser spends " + (System.currentTimeMillis()-deepSer) + "ms");
System.out.println("deep copy by ser--------------------");
System.out.println("userShallow=" + userShallow
+",userDeepSer=" + userDeepSer);
System.out.println("userShallow house=" + userShallow.getHouse()
+",userDeepSer house=" + userDeepSer.getHouse());
}
}
8.测试结果

Java实现深拷贝和浅拷贝的更多相关文章
- Java的深拷贝和浅拷贝
关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...
- 细说 Java 的深拷贝和浅拷贝
版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 未经允许,不得转载. 一.前言 任何变成语言中,其实都有浅拷贝和深拷贝的概念,Java 中也不例外.在对一个现 ...
- Java拷贝——深拷贝与浅拷贝
深拷贝和浅拷贝 值类型 vs 引用类型 在Java中,像数组.类Class.枚举Enum.Integer包装类等等,就是典型的引用类型,所以操作时一般来说采用的也是引用传递的方式: 但是Java的语言 ...
- 浅析java的深拷贝与浅拷贝
(转自:http://www.cnblogs.com/chenssy/p/3308489.html) 首先来看看浅拷贝和深拷贝的定义: 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式 ...
- 【Java】深拷贝和浅拷贝
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- java基础——深拷贝和浅拷贝的区别
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝. 深拷贝:对基本数据类型进行值传递,对引用数据类型船舰一个新的对象,并复制内容,这是深拷贝.
- Java问题解读系列之IO相关---Java深拷贝和浅拷贝
前几天和棒棒童鞋讨论Java(TA学的是C++)的时候,他提到一个浅拷贝和深拷贝的问题,当时的我一脸懵圈,感觉自己学Java居然不知道这个知识点,于是今天研究了一番Java中的浅拷贝和深拷贝,下面来做 ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
随机推荐
- 工作中常用css样式总结
一.HTML隐藏文本输入框 有三种方法: 1.<input type="hidden" value=""> 这是对任何元素都起作用的: 2.< ...
- PJzhang:centos7上LNMP方式安装dvwa漏洞测试环境
猫宁!!! 参考链接:https://www.jianshu.com/p/5491ce5bfbac https://www.cnblogs.com/wujuntian/p/8183952.html h ...
- (二分图最大匹配)51NOD 2006 飞行员配对
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中, ...
- hdu 2818 Building Block 种类并查集
在进行并的时候不能瞎jb并,比如(x, y)就必须把x并给y ,即fa[x] = y #include <iostream> #include <string> #includ ...
- 转 Oracle中merge into的使用
http://www.cnblogs.com/highriver/archive/2011/08/02/2125043.html
- 利用lsof去查看Unix/Linux进程打开了哪些文件
利用lsof去查看Unix/Linux进程打开了哪些文件 今天用了一下lsof,发现这个linux的小工具,功能非常强大而且好用. 我们可以方便的用它查看应用程序进程打开了哪些文件或者对于特定的一个文 ...
- re正则表达式公式讲解3
1.分组匹配 用()把需要分组的类型括起来,如下 import re m = re.search("([a-z]+)([0-9]+)","alex123" ...
- [ HEOI 2016 ] 树
\(\\\) Description 给出一颗树,开始只有 \(1\) 号节点有标记. \(\ C\ x\) 对 \(x\) 号节点打标记 \(\ Q\ x\) 查询 \(x\) 号节点深度最深的有标 ...
- ios 设置head请求头,自定义head, read response header
AFHTTPSessionManager *manger = [AFHTTPSessionManager manager]; manger.securityPolicy = [AFSecurityPo ...
- iOS 自己手动添加编译警告
文/青花瓷的平方(简书作者)原文链接:http://www.jianshu.com/p/b2e30cad2a0d著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 缘由 上一次生产环境我们 ...