所谓的浅复制,指的就是只复制对象的引用,复制后的引用和之前的引用都指向了同一个对象,还是原来的对象,而深复制指的就是重新开启,复制一份和原来一模一样的对象,原来的对象的改变不会影响到复制后的对象,而浅复制则会。
下面我自己写了一个实现深度复制的例子。原理很简单,首先要复制的对象得实现Seriable接口,然后将要复制的对象写到字节数组里,这个时候写进去的是对象的一个拷贝,再将拷贝出去的对象再读回来,就实现了所谓的深度复制。
要复制的对象的类:实现Seriable接口
package com.deepCopy;
import java.io.Serializable;
public class Person implements Serializable{
private String name;
private Integer age;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
/**
* @return the name
*/
public synchronized String getName() {
return name;
}
/**
* @param name the name to set
*/
public synchronized void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public synchronized Integer getAge() {
return age;
}
/**
* @param age the age to set
*/
public synchronized void setAge(Integer age) {
this.age = age;
}
}
package com.deepCopy;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* 深度复制
*
*/
public class CopyUtils {
public static Person deepCopy(Person orgin) throws IOException, ClassNotFoundException{
ByteArrayOutputStream bo=new ByteArrayOutputStream();
ObjectOutputStream op=new ObjectOutputStream(bo);
op.writeObject(orgin);
ByteArrayInputStream bs=new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream os=new ObjectInputStream(bs);
return (Person) os.readObject();
}
}
package com.deepCopy;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, IOException {
Person p1=new Person("zhangsan",20);
Person p2=CopyUtils.deepCopy(p1);
p1.setAge(21);
System.out.println(p2);
}
}
最后输出
20
这样就简单实现了一个深度复制。