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 ...
随机推荐
- 鸟哥私房菜基础篇:Linux 档案与目录管理习题
猫宁!!! 参考链接:http://linux.vbird.org/linux_basic/0220filemanager.php 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-什么是绝对路径与相对 ...
- C++11 多线程相关的头文件
C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable& ...
- Brush (IV) LightOJ - 1018
题意:平面上有一些点,每刷一次可以把同一条直线上的点都刷光,问最少几次把所有点刷光. 方法: 显然是一个状态压缩dp.ans[S]表示把S集合中点刷掉的最少次数.最开始想到的方法是如果S中只有一个或两 ...
- 牛客国庆集训派对Day_4~6
Day_4 A.深度学习 题目描述 小 A 最近在研究深度学习,他自己搭建了一个很牛逼的神经网络,现在他手头一共有 n 组训练数据,一开始他会给自己的神经网络设置一个 batch size,假设为 B ...
- 面试王牌 JAVA并发
Java 并发 JavathreadSocketC#C++ 并发 Table of Contents 1 什么是并发问题. 2多线程死锁问题 2 java中synchronized的用法 3 Java ...
- 用python编写的excel拆分小工具
from datetime import date,datetime from openpyxl import Workbook from openpyxl import load_workbook ...
- 容器API
- 2019/05/11 Java内存结构
1. 类加载子系统:负责从文件系统或者网络加载Class信息,加载的信息存放在一块称之方法区的内存空间. 2. 方法区:就是存放类的信息.常量信息.常量池信息.包括字符串字面量和数字常量等. 3. ...
- 模拟ssh的远程网络传输
粘包产生的原因分析: 第一点:客户端向服务端发起命令请求,服务端接受命令请求,并返回对应的信息,如果信息过大,客户端一次接受不了,那么下一次请求依然返回 上一个命令的内容,就出现了粘包的情况. 第二点 ...
- laravel的scout包安装及laravel-es包安装
安装laravel/scout 作用:搜索驱动,可随时更换驱动,上层业务逻辑可不用改变 官网文档:https://laravel-china.org/docs/laravel/5.4/scout/12 ...