阅读量:1
在Java中,深拷贝和浅拷贝可以通过不同的方式实现。
浅拷贝:浅拷贝是指在拷贝对象时,只复制对象的引用,而不复制对象本身。当对其中一个对象进行修改时,另一个对象也会受到影响。
使用以下方式实现浅拷贝:
- 实现
Cloneable
接口,并重写clone()
方法。在clone()
方法中,调用父类的clone()
方法,然后返回拷贝后的对象。public class MyClass implements Cloneable { private int value; public MyClass(int value) { this.value = value; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
- 使用
copy
方法进行拷贝。例如,可以使用Arrays.copyOf()
或System.arraycopy()
进行数组的浅拷贝。int[] array1 = {1, 2, 3}; int[] array2 = Arrays.copyOf(array1, array1.length);
- 实现
深拷贝:深拷贝是指在拷贝对象时,不仅复制对象的引用,还复制对象本身及其所有引用的对象。这样,在拷贝后的对象上进行修改不会影响原始对象。
使用以下方式实现深拷贝:
- 实现
Serializable
接口,并使用序列化和反序列化实现深拷贝。import java.io.*; public class MyClass implements Serializable { private int value; public MyClass(int value) { this.value = value; } public MyClass deepCopy() throws IOException, ClassNotFoundException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); MyClass copy = (MyClass) ois.readObject(); ois.close(); return copy; } }
- 使用第三方库,如Apache Commons Lang中的
SerializationUtils.clone()
方法进行深拷贝。MyClass copy = SerializationUtils.clone(original);
- 实现
需要注意的是,要使对象可以被拷贝,必须满足以下条件之一:
- 对象实现
Cloneable
接口并重写clone()
方法。 - 对象实现
Serializable
接口。 - 使用第三方库提供的深拷贝方法。