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

似乎对此产生了很多困惑和不同意见([1]和其他来源),究竟Arrays.copyOf会产生深拷贝还是浅拷贝。

该测试表明该副本很深:

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

解决方案是否仅是制作顶层维度的深层副本,而其他维度是浅层副本?真相是什么?

回答:

它产生一个浅表副本,即一个包含“旧”引用的 数组(指向相同的对象,这些对象没有被复制)。

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

该测试表明该副本很深:

不,不是的。当您将新对象分配给“原始”数组时,这不会影响副本。毕竟是副本。

这与以下情况相同:

String x = "foo";

String y = x;

x = "bar";

assertEquals(y, "foo");

这里没有“深层副本”。

以上是 Arrays.copyOf会产生浅拷贝还是深拷贝? 的全部内容, 来源链接: utcz.com/qa/403636.html

回到顶部