淘先锋技术网

首页 1 2 3 4 5 6 7

Java中的对象赋值常常被称为拷贝,但是实际上对象的拷贝分为浅拷贝和深拷贝两种。浅拷贝仅仅是复制了对象的 栈 空间,而深拷贝则会复制对象的 所有 空间。

以下是Java中实现浅拷贝和深拷贝的方法。

public class Person implements Cloneable {
private String name;
private int age;
private Listhobbies = new ArrayList<>();
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
//实现浅拷贝
public Person shallowCopy() throws CloneNotSupportedException {
return (Person) this.clone();
}
//实现深拷贝
public Person deepCopy() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (Person) ois.readObject();
}
//省略了getters和setters,以及构造方法
}

上述代码中,我们定义了一个Person类,并重写了java.lang.Object的clone方法。在Person类中,我们实现了shallowCopy和deepCopy方法,用于浅拷贝和深拷贝。

shallowCopy方法实现很简单,它直接调用Object对象原生的clone方法。
deepCopy方法的实现则需要通过将对象序列化和反序列化来实现深拷贝。

深拷贝会将对象的所有引用类型的子对象进行深拷贝,以保证完全独立和独立的可变状态。然而,在使用深拷贝的时候要注意,子对象必须全部是可序列化的,否则会抛出异常。

总之,浅拷贝和深拷贝都有各自的特点,需要根据实际需求进行选择。