gpt4 book ai didi

Java - 实现数组的深拷贝和浅拷贝

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:04 31 4
gpt4 key购买 nike

我想了解 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]

此结果与上一个链接的架构一致: Shallow copy

  • 深拷贝:

我在这个例子中使用了 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]

如果我们将深度复制逻辑基于之前的模式,结果应该是这样的: Deep copy

您可能会注意到,main 方法的执行结果与上述模式的逻辑不同。

欢迎任何解释。

最佳答案

我不知道你在哪里读到 copyOf() 执行深拷贝,因为那完全是错误的。

引用 Arrays.copyOf(T[] original, int newLength) 的 javadoc:

For all indices that are valid in both the original array and the copy, the two arrays will contain identical values.

这意味着它是一个浅拷贝。要成为深拷贝,值必须指向不同的对象,因为引用的对象也必须是副本。

要执行深复制,必须迭代数组并复制值。 Java 不能为您做这些,因为它不知道如何复制对象。

例如Java 怎么知道如何复制 NameValue 对象? 克隆()?复制构造函数?序列化+反序列化?工厂方法?其他方式?

关于Java - 实现数组的深拷贝和浅拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641495/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com