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实现深拷贝和浅拷贝的更多相关文章

  1. Java的深拷贝和浅拷贝

    关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...

  2. 细说 Java 的深拷贝和浅拷贝

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 未经允许,不得转载. 一.前言 任何变成语言中,其实都有浅拷贝和深拷贝的概念,Java 中也不例外.在对一个现 ...

  3. Java拷贝——深拷贝与浅拷贝

    深拷贝和浅拷贝 值类型 vs 引用类型 在Java中,像数组.类Class.枚举Enum.Integer包装类等等,就是典型的引用类型,所以操作时一般来说采用的也是引用传递的方式: 但是Java的语言 ...

  4. 浅析java的深拷贝与浅拷贝

    (转自:http://www.cnblogs.com/chenssy/p/3308489.html) 首先来看看浅拷贝和深拷贝的定义: 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式 ...

  5. 【Java】深拷贝和浅拷贝

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...

  6. java基础——深拷贝和浅拷贝的区别

    浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝. 深拷贝:对基本数据类型进行值传递,对引用数据类型船舰一个新的对象,并复制内容,这是深拷贝.

  7. Java问题解读系列之IO相关---Java深拷贝和浅拷贝

    前几天和棒棒童鞋讨论Java(TA学的是C++)的时候,他提到一个浅拷贝和深拷贝的问题,当时的我一脸懵圈,感觉自己学Java居然不知道这个知识点,于是今天研究了一番Java中的浅拷贝和深拷贝,下面来做 ...

  8. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  9. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

随机推荐

  1. 第十五篇 .NET高级技术之正则表达式

    正则表达式 正则表达式是对字符串进行匹配的语法,像name like '%李%'一样,定义了一些特殊的“元字符”,用来判断一个字符串是否满足某个规则.正则表达式非常深,编译器都是基于正则表达式,掌握基 ...

  2. jQuery笔记之工具方法—Ajax 优化回调地狱

    在上一篇文我们说到了回调地狱不好的地方,今天我们看看怎么来优化它,让它可以运用到实际开发中. 什么是回调地狱?回调地狱就是一个函数里面嵌套了所有功能函数,然后缩略图形成一个三角形. 这样的代码可复用性 ...

  3. Ubuntu开机之后报错结局方法

    sudo gedit /etc/default/apport 把里面的enabled=1改成enabled=,保存 201. 就是下雨也去.202. 我马上拿来.203. 孙英开飞机.204. 国华来 ...

  4. Python基础知识(3)

    1:字符串类型转换 num = 100 num2 = " #num是整数类型的值,num2是字符串类型的值,如果把他们两个的类型转换下呢? int(num2) #int 整形成整数 str( ...

  5. bzoj 5018 [Snoi2017]英雄联盟

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5018 题解 简单的dp 令dp[i][j]表示前i个英雄 总花费为j 最大能够得到的展示种数 ...

  6. pwa-serviceWorker与页面通信postMessage

    https://ppt.geekbang.org/list/gmtc2018?from=groupmessage&amp%3Bisappinstalled=0 http://www.sohu. ...

  7. 在sz

    在大城市,sz, 每天骑单车去公交车站. 每天用高德地图 坐快线巴士 车上下班要3个小时. 用guomei 的回收管家 回收 旧空调. 我在kfc 看书 在班车上睡觉/眯眼 在办公室睡觉,看书,工作 ...

  8. AJPFX的反射学习笔记

    反射是描述 数据结构的结构        属性.方法(数据)元数据        类(数据结构)描述数据的结构-->类也是特殊的对象---->元数据        CLASS类 描述数据结 ...

  9. re正则表达式公式讲解1

    常用的表达式一些规则 1.“.”  匹配出了\n之外的任意一个字符,包括特殊字符 有几个·就匹配几个字符. import re print(re.search("."," ...

  10. eclipse搭建android开发环境详细步骤

    搭建android应用的开发环境,一套程序下来也是相当繁琐的,这里我整理下一整套详细流程: 1,下载JDK 去oracle官网下载最新版本的jdk,官网地址 http://www.oracle.com ...