首先什么是深度复制?什么又是浅复制?
百度告诉我--------------->
浅复制:将一个对象复制后,基本类型都会重新创建,而引用类型指向的还是原对象所指的引用;
深复制:讲一个对象复制后,不论是基本类型还是引用类型都是重新创建的。
下面看我们的深度复制方法
package everyworkdayprogramming._2015_3_03; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Date; /** * * 在使用对象流对对象进行深度复制的时候对象必须实现Cloneable,Serializable接口 * 前者标明对象是可以被复制的,后者则是为了能够满足我们使用对象流对对象进行深度复制 * * */ public class CopySource implements Cloneable, Serializable { /** * @Fields serialVersionUID : 对象的序列化唯一标识 */ private static final long serialVersionUID = -3446490540857082055L; /* 定义连个变量,不是基本类型,而且都实现了Serializable 接口 */ private String string; private SerializableObject serializableObject; public String getString() { return string; } public void setString(String string) { this.string = string; } public SerializableObject getSerializableObject() { return serializableObject; } public void setSerializableObject(SerializableObject serializableObject) { this.serializableObject = serializableObject; } /* 浅复制 */ public Object clone() throws CloneNotSupportedException { /* 浅复制直接调用父类的clone方法就可以进行复制 */ CopySource copySource = (CopySource) super.clone(); return copySource; } /* 深复制 */ public Object deepClone() throws IOException, ClassNotFoundException { /* 写入当前对象的二进制流 */ ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream oout = new ObjectOutputStream(out); oout.writeObject(this); /* 读出二进制流产生的新对象 */ ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream( out.toByteArray())); /* 这样我们的深度复制工作就完成了;所有对象都是新的 */ return oin.readObject(); } } /** * * 该类包含在CopySource中,用于测试是否对类的实例中的该对象进行了深度复制 * * */ class SerializableObject implements Serializable { /** * @Fields serialVersionUID : 对象的序列化唯一标识 */ private static final long serialVersionUID = 6357352492173107445L; /* 一下的属性用于测试对象中的对象中的对象是否还可以被深度复制 */ /* 基本类型 */ private int x = 1; /* 非基本类型 */ private Date date; private SerializableObject1 serializableObject1; public int getX() { return x; } public void setX(int x) { this.x = x; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public SerializableObject1 getSerializableObject1() { return serializableObject1; } public void setSerializableObject1(SerializableObject1 serializableObject1) { this.serializableObject1 = serializableObject1; } } /** * * 对象中的对象中的对象,当然也实现了Serializable * * */ class SerializableObject1 implements Serializable { /** * @Fields serialVersionUID : 对象的序列化唯一标识 */ private static final long serialVersionUID = 1L; }
测试方法:
package everyworkdayprogramming._2015_3_03; import java.io.IOException; import java.util.Date; public class Test { public static void main(String[] args) { /* 创建要被复制的对象,并初始化相应属性 */ CopySource copy = new CopySource(); copy.setSerializableObject(new SerializableObject()); copy.setString("123"); copy.getSerializableObject().setX(2); copy.getSerializableObject().setDate(new Date()); copy.getSerializableObject().setSerializableObject1( new SerializableObject1()); try { /* 浅复制copy 到 copy1 */ CopySource copy1 = (CopySource) copy.clone(); /* 深复制copy 到 copy2 */ CopySource copy2 = (CopySource) copy.deepClone(); /* 判断SerialiableObject在浅复制和深复制后是否与原对象中的相等 */ System.out .println("----------------------------------------------------------判断SerialiableObject在浅复制和深复制后是否与原对象中的相等"); System.out.println(copy.getSerializableObject() == copy1 .getSerializableObject()); System.out.println(copy.getSerializableObject() == copy2 .getSerializableObject()); /* 判断string在浅复制和深复制后是否与原对象的相等 */ System.out .println("----------------------------------------------------------判断string在浅复制和深复制后是否与原对象的相等"); System.out.println(copy.getString() == copy1.getString()); System.out.println(copy.getString() == copy2.getString()); /* 判断SerializableObject中的DATE在浅复制和深复制后是否与原对象相等 */ System.out .println("----------------------------------------------------------判断SerializableObject中的DATE在浅复制和深复制后是否与原对象相等 "); System.out.println(copy.getSerializableObject().getDate() == copy1 .getSerializableObject().getDate()); System.out.println(copy.getSerializableObject().getDate() == copy2 .getSerializableObject().getDate()); /* 判断SerializableObject中的SerializableObject1在浅复制和深复制后是否与原对象相等 */ System.out .println("----------------------------------------------------------判断SerializableObject中的SerializableObject1在浅复制和深复制后是否与原对象相等"); System.out.println(copy.getSerializableObject() .getSerializableObject1() == copy1.getSerializableObject() .getSerializableObject1()); System.out.println(copy.getSerializableObject() .getSerializableObject1() == copy2.getSerializableObject() .getSerializableObject1()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
原文地址:http://blog.csdn.net/u012613903/article/details/44057941