📜  Java示例的深、浅和惰性复制(1)

📅  最后修改于: 2023-12-03 14:43:03.106000             🧑  作者: Mango

Java示例的深、浅和惰性复制

在Java中,对象的复制分为深复制、浅复制和惰性复制三种。在进行对象的复制操作时,需要注意对象本身以及对象中所包含的引用类型对象的复制情况。本文将分别介绍这三种复制方式的特点和示例。

浅复制

所谓浅复制,就是将对象的引用复制一份,指向同一个对象。也就是说,在对一个对象进行浅复制时,只会复制该对象本身的数据,而不会复制对象中所包含的引用类型对象。因此,对该对象及其引用类型对象所做出的改变,将会对所有引用该对象的对象都产生影响。

下面给出一个简单的示例:

public class ShallowCopy {
    private int[] data;

    public ShallowCopy(int[] data) {
        this.data = data;
    }

    public void setData(int[] data) {
        this.data = data;
    }

    public int[] getData() {
        return data;
    }

    public static void main(String[] args) {
        int[] data = {1, 2, 3};
        ShallowCopy original = new ShallowCopy(data);
        ShallowCopy copied = original;

        original.setData(new int[]{4, 5, 6});

        System.out.println(Arrays.toString(original.getData()));
        System.out.println(Arrays.toString(copied.getData()));
    }
}

输出结果为:

[4, 5, 6]
[4, 5, 6]

可以看到,对original对象的改变同时也作用于copied对象。因为copied对象只是对original对象的引用,所以它们指向的是同一个对象。

深复制

相比于浅复制,深复制则是将对象及其所包含的引用类型对象都复制一份,互不影响。因此,在对一个对象进行深复制时,需要复制对象本身以及对象中所包含的所有引用类型对象。

下面给出一个示例:

public class DeepCopy implements Cloneable {
    private int[] data;

    public DeepCopy(int[] data) {
        this.data = data;
    }

    public void setData(int[] data) {
        this.data = data;
    }

    public int[] getData() {
        return data;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        DeepCopy copy = (DeepCopy) super.clone();
        copy.data = this.data.clone();
        return copy;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        int[] data = {1, 2, 3};
        DeepCopy original = new DeepCopy(data);
        DeepCopy copied = (DeepCopy) original.clone();

        original.setData(new int[]{4, 5, 6});

        System.out.println(Arrays.toString(original.getData()));
        System.out.println(Arrays.toString(copied.getData()));
    }
}

输出结果为:

[4, 5, 6]
[1, 2, 3]

可以看到,对original对象的改变并不会对copied对象产生影响。因为它们指向的是两个不同的对象。

惰性复制

惰性复制是一种特殊的复制方式,它只在需要时才进行复制。在这种情况下,对象只有在被修改时才会被复制,否则将一直使用原对象。因此,这种方式既可以避免对内存的浪费,又可以保证数据的实时性。惰性复制的实现方式有很多种,这里不作详细介绍。

总结

在Java中,有三种常见的对象复制方式:浅复制、深复制和惰性复制。选择何种方式取决于具体的业务需求。如果需要完整复制一个对象及其引用类型对象时,应该使用深复制。如果只需要拷贝一个对象的引用,则可以使用浅复制。对于需要复制的对象较大或复制次数较少的情况,可以考虑使用惰性复制。