一、深拷贝和浅拷贝有什么区别?
深拷贝和浅拷贝大概区别如下:
- 浅拷贝:只拷贝引用(即原对象和拷贝对象的属性都指向同一个内存地址)
- 深拷贝:全部拷贝(即原对象和拷贝对象的属性也会完全拷贝一个新的对象而不是拷贝引用)
1、浅拷贝
如何进行浅拷贝?:实现Cloneable
接口,并重写clone()
方法
public class IdCard implements Cloneable {
public String name;
// ...
@Override
public IdCard clone() {
try {
return (IdCard) super.clone();
} catch (CloneNotSupportedException e) {
// ...
}
}
}
public class User implements Clone {
public IdCard idCard;
// ...
@Override
public User clone() {
try {
return (User) super.clone();
} catch (CloneNotSupportedException e) {
// ...
}
}
}
测试:
public class TestClass {
public static void main(String[] args) {
User user = new User(new Money(520));
User cpUser = user.clone();
System.out.println(user.getIdCard() == cpUser.getIdCard()); // true
}
}
结论:user
和cpUser
的idCard
属性仍然用的是同一个对象
2、深拷贝
public class IdCard implements Cloneable {
public String name;
// ...
@Override
public IdCard clone() {
try {
return (IdCard) super.clone();
} catch (CloneNotSupportedException e) {
// ...
}
}
}
public class User implements Clone {
@Override
public User clone() {
try {
User user = (User) super.clone();
user.setIdCard(person.getIdCard().clone());
return user;
} catch (CloneNotSupportedException e) {
// ...
}
}
}
测试:
public class TestClass {
public static void main(String[] args) {
User user = new User(new Money(520));
User cpUser = user.clone();
System.out.println(user.getIdCard() == cpUser.getIdCard()); // false
}
}
3、引用拷贝
引用拷贝和深拷贝、浅拷贝不同的是,引用拷贝的原对象和拷贝对象都是指向同一个对象,如下图所示:
总结一下引用拷贝、浅拷贝、深拷贝的区别:
- 引用拷贝:只拷贝引用
- 浅拷贝:只拷贝对象,不拷贝对象属性引用
- 深拷贝:全部拷贝