java深拷贝和浅拷贝怎么实现

在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接口。
使用第三方库提供的深拷贝方法。

阅读剩余
THE END