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 ...
随机推荐
- bzoj4517[Sdoi2016]排列计数(组合数,错排)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1792 Solved: 1111[Submit][Stat ...
- ASI框架的使用
iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...
- 弹射起步~django
sudo apt-get installl tree 开始创建工作目录 django-admin.py startproject mysite 创建一个名为 mysite的子目录,然后我们通过tree ...
- C# ref和out传递参数总结
如有雷同,不胜荣幸,若转载,请注明 C#中ref和out传递参数总结,两个都可用来传递参数,ref使用时必须先进行初始化,out则不需要,只要在返回之前赋值即可,文字废话到此,下面直接上例子 ref例 ...
- Centos6.8 搭建 Mysql 主从复制
实例环境: MySQL-Master:Centos-6.8:192.168.153.130 MySQL-Slave:Centos-6.8:192.168.153.131 1.两台服务器安装mysql ...
- Salazar Slytherin's Locket CodeForces - 855E
Salazar Slytherin's Locket CodeForces - 855E http://www.cnblogs.com/ftae/p/7590187.html 数位dp: http:/ ...
- 日历 php
<?php $year=@$_GET['year']; //获得地址栏的年份 $month=@$_GET['month']; //获得地址栏的月份 if(empty($year)) $year= ...
- Nginx缓存[proxy cache、memcache]
nginx自带缓存 nginx自己有单独的进程来对磁盘上的缓存文件进行扫描,在内存中建立缓存索引.并且有管理进程来对缓存进行过期判断,更新等操作 定义:只能在http段中使用 proxy_cache_ ...
- PowerShell~语法与运算符
基本语法 变量:$开头 $a = "Hello" 条件语句:if else ) { Write-Host "偶数" } else{ Write-Host &qu ...
- iOS 项目代码组织
参考了很多系列,发现老外们都比较喜欢 group by type,这两个还不错: http://akosma.com/2009/07/28/code-organization-in-xcode-pro ...