gpt4 book ai didi

java - Arrays.copyOf 产生浅拷贝还是深拷贝?

转载 作者:太空宇宙 更新时间:2023-11-04 13:10:55 24 4
gpt4 key购买 nike

关于 Arrays.copyOf 是否会生成深拷贝或浅拷贝,似乎存在很多困惑和不同的意见([1] 和其他来源)。

此测试表明副本很深:

String[] sourceArray = new String[] { "Foo" };
String[] targetArray = java.util.Arrays.copyOf( sourceArray, 1 );

sourceArray[0] = "Bar";

assertThat( targetArray[0] ).isEqualTo( "Foo" ); // passes

此测试表明副本很浅:

String[][] sourceArray = new String[][] { new String[] { "Foo" } };
String[][] targetArray = java.util.Arrays.copyOf( sourceArray, 1 );

sourceArray[0][0] = "Bar";

assertThat( targetArray[0][0] ).isEqualTo( "Foo" ); // fails

解决办法是不是简单的把顶层维度做深拷贝,其他维度做浅拷贝?真相是什么?

[1] How do I do a deep copy of a 2d array in Java?

最佳答案

它生成一个浅拷贝,即一个包含“旧”引用的数组(对于相同的对象,这些对象没有被复制)。

特别是,如果您有嵌套数组,则不会复制它们。您将得到一个新数组,其“顶级”指向与原始数组相同的“第二级”数组。这些嵌套数组内的任何更改都将反射(reflect)在副本和原始数组中。

This test suggests that the copy is deep:

不,事实并非如此。当您将新对象分配给“原始”数组时,这不会影响副本。毕竟,它是一个副本。

这与以下情况相同:

String x = "foo";
String y = x;
x = "bar";

assertEquals(y, "foo");

这里没有“深层复制”。

关于java - Arrays.copyOf 产生浅拷贝还是深拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33965288/

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