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 ...
随机推荐
- 第十五篇 .NET高级技术之正则表达式
正则表达式 正则表达式是对字符串进行匹配的语法,像name like '%李%'一样,定义了一些特殊的“元字符”,用来判断一个字符串是否满足某个规则.正则表达式非常深,编译器都是基于正则表达式,掌握基 ...
- jQuery笔记之工具方法—Ajax 优化回调地狱
在上一篇文我们说到了回调地狱不好的地方,今天我们看看怎么来优化它,让它可以运用到实际开发中. 什么是回调地狱?回调地狱就是一个函数里面嵌套了所有功能函数,然后缩略图形成一个三角形. 这样的代码可复用性 ...
- Ubuntu开机之后报错结局方法
sudo gedit /etc/default/apport 把里面的enabled=1改成enabled=,保存 201. 就是下雨也去.202. 我马上拿来.203. 孙英开飞机.204. 国华来 ...
- Python基础知识(3)
1:字符串类型转换 num = 100 num2 = " #num是整数类型的值,num2是字符串类型的值,如果把他们两个的类型转换下呢? int(num2) #int 整形成整数 str( ...
- bzoj 5018 [Snoi2017]英雄联盟
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5018 题解 简单的dp 令dp[i][j]表示前i个英雄 总花费为j 最大能够得到的展示种数 ...
- pwa-serviceWorker与页面通信postMessage
https://ppt.geekbang.org/list/gmtc2018?from=groupmessage&%3Bisappinstalled=0 http://www.sohu. ...
- 在sz
在大城市,sz, 每天骑单车去公交车站. 每天用高德地图 坐快线巴士 车上下班要3个小时. 用guomei 的回收管家 回收 旧空调. 我在kfc 看书 在班车上睡觉/眯眼 在办公室睡觉,看书,工作 ...
- AJPFX的反射学习笔记
反射是描述 数据结构的结构 属性.方法(数据)元数据 类(数据结构)描述数据的结构-->类也是特殊的对象---->元数据 CLASS类 描述数据结 ...
- re正则表达式公式讲解1
常用的表达式一些规则 1.“.” 匹配出了\n之外的任意一个字符,包括特殊字符 有几个·就匹配几个字符. import re print(re.search("."," ...
- eclipse搭建android开发环境详细步骤
搭建android应用的开发环境,一套程序下来也是相当繁琐的,这里我整理下一整套详细流程: 1,下载JDK 去oracle官网下载最新版本的jdk,官网地址 http://www.oracle.com ...