gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:45:05 25 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/18351726/

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