在Java中,深拷貝和淺拷貝可以通過(guò)不同的方式實(shí)現(xiàn)。
淺拷貝:淺拷貝是指在拷貝對(duì)象時(shí),只復(fù)制對(duì)象的引用,而不復(fù)制對(duì)象本身。當(dāng)對(duì)其中一個(gè)對(duì)象進(jìn)行修改時(shí),另一個(gè)對(duì)象也會(huì)受到影響。
使用以下方式實(shí)現(xiàn)淺拷貝:
Cloneable
接口,并重寫(xiě)clone()
方法。在clone()
方法中,調(diào)用父類(lèi)的clone()
方法,然后返回拷貝后的對(duì)象。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
方法進(jìn)行拷貝。例如,可以使用Arrays.copyOf()
或System.arraycopy()
進(jìn)行數(shù)組的淺拷貝。int[] array1 = {1, 2, 3};
int[] array2 = Arrays.copyOf(array1, array1.length);
深拷貝:深拷貝是指在拷貝對(duì)象時(shí),不僅復(fù)制對(duì)象的引用,還復(fù)制對(duì)象本身及其所有引用的對(duì)象。這樣,在拷貝后的對(duì)象上進(jìn)行修改不會(huì)影響原始對(duì)象。
使用以下方式實(shí)現(xiàn)深拷貝:
Serializable
接口,并使用序列化和反序列化實(shí)現(xiàn)深拷貝。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;
}
}
SerializationUtils.clone()
方法進(jìn)行深拷貝。MyClass copy = SerializationUtils.clone(original);
需要注意的是,要使對(duì)象可以被拷貝,必須滿(mǎn)足以下條件之一:
Cloneable
接口并重寫(xiě)clone()
方法。Serializable
接口。