我正在尝试理解Java中浅拷贝和深拷贝的概念。有很多关于这个主题的文章和问答,但每当我尝试在真实的Java代码中实现这些概念时,一切都变得不清楚了。
其中一个回答是我理解的基础,可以在此链接中通过示意图来解释深拷贝和浅拷贝。
下面我将展示每种情况的实现:
- 浅拷贝:
我以System.arraycopy()方法为例,因为我在许多文章中读到它执行浅拷贝(还有clone方法)。
执行主方法的结果如下:
这个结果与前面链接的架构相符:
如果我们基于之前的模式来实现深拷贝逻辑,应该得到以下结果: 正如您所看到的,主方法执行的结果与上面模式的逻辑不同。
欢迎任何解释。
其中一个回答是我理解的基础,可以在此链接中通过示意图来解释深拷贝和浅拷贝。
下面我将展示每种情况的实现:
- 浅拷贝:
我以System.arraycopy()方法为例,因为我在许多文章中读到它执行浅拷贝(还有clone方法)。
public class Test {
public static void main(String[] args) {
NameValue[] instance1 = {
new NameValue("name1", 1),
new NameValue("name2", 2),
new NameValue("name3", 3),
};
NameValue[] instance2 = new NameValue[instance1.length];
// Print initial state
System.out.println("Arrays before shallow copy:");
System.out.println("Instance 1: " + Arrays.toString(instance1));
System.out.println("Instance 2: " + Arrays.toString(instance2));
// Perform shallow copy
System.arraycopy(instance1, 0, instance2, 0, 3);
// Change instance 1
for (int i = 0; i < 3; i++) {
instance1[i].change();
}
// Print final state
System.out.println("Arrays after shallow copy:");
System.out.println("Instance 1: " + Arrays.toString(instance1));
System.out.println("Instance 2: " + Arrays.toString(instance2));
}
private static class NameValue {
private String name;
private int value;
public NameValue(String name, int value) {
super();
this.name = name;
this.value = value;
}
public void change() {
this.name = this.name + "-bis";
this.value = this.value + 1;
}
@Override
public String toString() {
return this.name + ": " + this.value;
}
}
}
执行主方法的结果如下:
Arrays before shallow copy:
Instance 1: [name1: 1, name2: 2, name3: 3]
Instance 2: [null, null, null]
Arrays after shallow copy:
Instance 1: [name1-bis: 2, name2-bis: 3, name3-bis: 4]
Instance 2: [name1-bis: 2, name2-bis: 3, name3-bis: 4]
这个结果与前面链接的架构相符:
- 深拷贝:
我以Arrays.copyOf()方法为例,因为我在许多文章中读到它执行深拷贝(以及Arrays.copyOfRange方法)。
public static void main(String[] args) {
NameValue[] instance1 = {
new NameValue("name1", 1),
new NameValue("name2", 2),
new NameValue("name3", 3),
};
NameValue[] instance2 = new NameValue[instance1.length];
// Print initial state
System.out.println("Arrays before deep copy:");
System.out.println("Instance 1: " + Arrays.toString(instance1));
System.out.println("Instance 2: " + Arrays.toString(instance2));
// Perform deep copy
instance2 = Arrays.copyOf(instance1, 3);
// Change instance 1
for (int i = 0; i < 3; i++) {
instance2[i].change();
}
// Print final state
System.out.println("Arrays after deep copy:");
System.out.println("Instance 1: " + Arrays.toString(instance1));
System.out.println("Instance 2: " + Arrays.toString(instance2));
}
显示以下内容:
Arrays before deep copy:
Instance 1: [name1: 1, name2: 2, name3: 3]
Instance 2: [null, null, null]
Arrays after deep copy:
Instance 1: [name1-bis: 2, name2-bis: 3, name3-bis: 4]
Instance 2: [name1-bis: 2, name2-bis: 3, name3-bis: 4]
如果我们基于之前的模式来实现深拷贝逻辑,应该得到以下结果: 正如您所看到的,主方法执行的结果与上面模式的逻辑不同。
欢迎任何解释。
Arrays.copyOf
执行深拷贝的事实来构建我的逻辑。现在,既然你们中的许多人确认它生成浅拷贝,事情就更清楚了。 - Strider