关于 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
解决方法是简单的顶层维度做深拷贝,其他维度做浅拷贝吗?真相是什么?
最佳答案
它产生一个浅拷贝,即一个包含“旧”引用的新数组(指向相同的对象,那些没有被复制)。
特别是,如果您有嵌套数组,则不会复制这些数组。您将得到一个新数组,其“顶级”指向与原始数组相同的“第二级”数组。这些嵌套数组中的任何更改都将反射(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/