深拷贝与浅拷贝的区别在于:
对于基本数据类型,浅拷贝和深拷贝都是直接拷贝的值。
对于引用数据类型,浅拷贝拷贝的是引用(即内存地址,不开辟新的内存空间),深拷贝是开辟了新的内存空间,创建了相同值的对象。
想要实现拷贝很简单,让被拷贝的对象实现Cloneable接口,然后重写Object的clone方法即可:
@Getter
@Setter
@ToString
@AllArgsConstructor
public class User implements Cloneable{
private String name;
private Integer age;
private String address;
private Integer sex;
@Override
public Object clone() {
try {
User u = (User) super.clone();
return u;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
public static void main(String[] args) {
User u = new User("小明",18,"北京",1);
User u1 = u;
User u2 = (User) u.clone();
System.out.println(u.hashCode());
System.out.println(u1.hashCode());
System.out.println(u2.hashCode());
}
//输出结果:
366712642
366712642
1829164700
可以看到上面通过clone方法,从 u 新建了一个对象 u2 ,他们的hash值是不同的,但是呢,这依然属于浅拷贝,因为当u对象中有其他对象时,它拷贝的还是引用。需要继续重写clone方法,才能实现深拷贝。