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

标签 java

关于 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/

相关文章:

java - 确定何时关闭 Java 中的声音播放线程

java - 从java运行bat文件时有什么方法可以模拟用户输入吗?

java - 需要根据行对列进行排序

java - 使用静态变量节省数组空间

java - flash如何通过J2EE认证——它无法发送包含jsessionid的cookie

java - 尝试在我的 java 应用程序中导入音频文件 : misplaced construct(s)

java - JFrame 中的重复 JLabel

java - 为 A* 搜索计算 f_score[neighbor]

java - 如果在依赖 jar 中,message.properties 的类路径是什么

java - java.lang.String.concat 可以改进吗?