如果我创建一个2d int
数组,然后使用 Arrays.copyOf()
,就像这样-
jshell> int[][] c1 = {{1,2}, {3,4}}
c1 ==> int[2][] { int[2] { 1, 2 }, int[2] { 3, 4 } }
jshell> int[][] d1 = Arrays.copyOf(c1, c1.length)
d1 ==> int[2][] { int[2] { 1, 2 }, int[2] { 3, 4 } }
如果我随后更改了副本中的一个元素,为什么原始2d数组中的对应单元格会在这个过程中发生突变?
jshell> d1[0][0] = 0
$21 ==> 0
jshell> d1
d1 ==> int[2][] { int[2] { 0, 2 }, int[2] { 3, 4 } }
jshell> c1
c1 ==> int[2][] { int[2] { 0, 2 }, int[2] { 3, 4 } } // c1[0][0] was 1 originally
这让我相信在使用 Arrays.copyOf()
,则只为最外层的数组创建单独的副本,而每个内部数组仍然是对原始二维数组的内部数组的引用?
jshell> d1 = null
d1 ==> null
jshell> c1
c1 ==> int[2][] { int[2] { 0, 2 }, int[2] { 3, 4 } }
如果是,为什么是这样?不应该 Arrays.copyOf()
创建不同的副本,至少每个文档?oracle文档中是否记录了这种行为?
最后,用同样的方法创建二维数组的不同副本的正确方法是什么 Arrays.copyOf()
适用于1d阵列?
2条答案
按热度按时间mxg2im7a1#
方法
Arrays.copyOf
不执行数组的深度复制,也不执行System.arraycopy
方法。您应该使用所需的复制深度自己实现数组的深度复制算法。例如:对于对象数组也是如此:
3phpmpom2#
2d数组基本上是包含数组的数组,并且
Arrays.copyOf
执行浅层复制,因此只复制外部数组(数组的数组),而不复制数组内部的值(在本例中,是数组的数组)int
,即int[]
). 因此,原件和复印件都包含相同的内容int[]
数组,因此如果通过一个数组进行修改,结果也可以通过另一个数组看到。javadoc中明确提到了这一点:
对于在原始数组和副本中都有效的所有索引,这两个数组将包含相同的值。
你需要在知道签名的情况下阅读:
<T> T[] copyOf(T[], int)
. 已复制阵列T[]
(一组T
,在哪里T
是int[]
),不是T[][]
!对于2d数组的深度复制,您必须自己进行深度复制,例如,请参阅如何在java中进行2d数组的深度复制?