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方法的实现则需要通过将对象序列化和反序列化来实现深拷贝。
深拷贝会将对象的所有引用类型的子对象进行深拷贝,以保证完全独立和独立的可变状态。然而,在使用深拷贝的时候要注意,子对象必须全部是可序列化的,否则会抛出异常。
总之,浅拷贝和深拷贝都有各自的特点,需要根据实际需求进行选择。