【发布时间】:2016-12-03 03:33:52
【问题描述】:
我试图理解 Java 中浅拷贝和深拷贝的概念。 有很多关于这个主题的文章和问答,但是每当我尝试在真实的 Java 代码中实现这些概念时,一切都变得不清楚。
我的理解所依据的答案之一是 this link,其中通过模式解释了深复制和浅复制。
我将在下面为您展示每种情况的实现:
- 浅拷贝:
我以方法 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]
你可能注意到了,main方法的执行结果和上面schema的逻辑是不一样的。
欢迎任何解释。
【问题讨论】:
-
哇,你真的在这里花了很多时间。希望您实际上并没有提供 太多 信息(例如,我更想跳到下一个问题,只是因为我可能需要 10 分钟来消化您的输入) .但只是为了它:尝试使用 clone 方法而不是 copyOf() (我认为这不会浪费时间克隆东西,而只是做一个浅拷贝)
-
Arrays.copyOf 进行浅拷贝。
-
只能通过比较两个实例来判断是深拷贝还是浅拷贝。基本上,它们应该具有“相同的内容”,但如果它是深层副本,则不应引用相同的对象。如果您使用 Java(或其他语言以及它们如何处理它)进行开发,您应该了解一些关于引用和东西的事情。
-
@sascha10000 我误解了一些事情,因为我的逻辑基于
Arrays.copyOf执行深层复制这一事实。现在你们中的许多人确认它会产生浅拷贝,事情就更清楚了
标签: java arrays deep-copy shallow-copy