📅  最后修改于: 2023-12-03 14:43:03.106000             🧑  作者: Mango
在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中,有三种常见的对象复制方式:浅复制、深复制和惰性复制。选择何种方式取决于具体的业务需求。如果需要完整复制一个对象及其引用类型对象时,应该使用深复制。如果只需要拷贝一个对象的引用,则可以使用浅复制。对于需要复制的对象较大或复制次数较少的情况,可以考虑使用惰性复制。