- 浅拷贝
- 表示仅仅拷贝了对象内的基本类型,对引用类型只有进行了地址的引用。
- Spring包下的
BeanUtils.copyProperties(source, target)
也是浅拷贝。 - 注:不能通过hashcode来判断两个对象是否进行了浅拷贝还是深拷贝,因为默认的hashcode有5种生成方式,默认是栈中的地址
- 深拷贝
- 将对象内的所有数据进行了拷贝,相当与新创建了一个对象。
public class CloneTest {
public static void main(String args[]) {
Address addr = new Address();
addr.setAdd("杭州市");
Student stu1 = new Student();
stu1.setNumber(123);
stu1.setAddr(addr);
Student stu2 = (Student)stu1.clone();
System.out.println("学生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());
System.out.println("学生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());
addr.setAdd("西湖区");
System.out.println("学生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());
System.out.println("学生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());
}
}
class Address implements Cloneable, Serializable {
private static final long serialVersionUID = -1033732588335640820L;
private String add;
public String getAdd() {
return add;
}
public void setAdd(String add) {
this.add = add;
}
}
class Student implements Cloneable, Serializable{
private static final long serialVersionUID = -7257300448359408841L;
private int number;
private Address addr;
public Address getAddr() {
return addr;
}
public void setAddr(Address addr) {
this.addr = addr;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public Object clone() {
Student stu = null;
try{
stu = (Student)super.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return stu;
}
}
class ObjCloner {
public static <T>T cloneObj(T obj){
T retVal = null;
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
retVal = (T)ois.readObject();
}catch(Exception e){
e.printStackTrace();
}
return retVal;
}
}
借鉴来源
- 深拷贝
- 浅拷贝