Java System.ArrayCopy如何复制阵列的阵列?

Java System.ArrayCopy如何复制阵列的阵列?,java,arrays,Java,Arrays,假设我有以下数组声明: newdouble[]{newdouble[]{1,2,3},newdouble[]{4,5,6},newdouble[]{7,8,9} 我想在给定的方向上“平移”(移位)数组的内容,将现有内容保留在未覆盖的单元格中,例如: 1 2 3 1 1 2 4 5 6 Shifted by +1 in x becomes: 4 4 5 7 8 9 7

假设我有以下数组声明:

newdouble[]{newdouble[]{1,2,3},newdouble[]{4,5,6},newdouble[]{7,8,9}

我想在给定的方向上“平移”(移位)数组的内容,将现有内容保留在未覆盖的单元格中,例如:

1 2 3                                1 1 2
4 5 6   Shifted by +1 in x becomes:  4 4 5
7 8 9                                7 7 8


1 2 3                                1 2 3
4 5 6   Shifted by +1 in y becomes:  1 2 3
7 8 9                                4 5 6
我可以使用System.arraycopy相当轻松地执行这些操作:

轮班制:

boolean b2t = dy<0; // bottom to top movement
dy = Math.abs(dy);

if (b2t)
{
    System.arraycopy(a, dy, a, 0, (a.length-dy));
}
else
{
    System.arraycopy(a, 0, a, dy, (a.length-dy));   
}
当我尝试同时做这两件事时(例如,
dx=1和dy=1
),就会出现有趣的行为

如果我按照显示的顺序使用上面的代码(dy然后dx),那么复制的数组似乎会在for循环迭代中被更新

e、 g对于1..9示例,对于dx=1和dy=1,我观察到的变化如下:

Orig.        dy   for:dx(1)      dx(2)      dx(3)
1 2 3      1 2 3      1 1 2      1 1 1      1 1 1
4 5 6   -> 1 2 3   -> 1 1 2   -> 1 1 1   -> 1 1 1
7 8 9      4 5 6      4 5 6      4 5 6      4 4 5
如您所见,在
dx
变换中的
for
循环期间,它将第一行和第二行视为同一对象;所以两次应用转换-两次都应用于两个数组

System.arraycopy的文档说明:

如果src和dest参数引用同一个数组对象,然后执行复制,就好像位置srcPos到srcPos+length-1处的组件首先被复制到具有长度组件的临时数组,然后临时数组的内容被复制到目标数组的位置destPos到destPos+length-1

换句话说,当完成
dy
变换时,最上面的两行被复制到一个单独的临时数组中,然后返回到主数组
a
,但处于移位位置

在我看来,它似乎是在将
引用
复制到数组,而不是数组本身-是这样吗


无论如何,我可以通过交换代码来解决这个问题,这样它就可以在dy之前进行dx移位;但确认一下这里发生了什么是有趣的;因为如果我想把它扩展到3维空间,我就不能重新排列它使它工作。

是的,它是在复制引用

二维数组实际上是一个数组,其元素是数组类型的对象

因此,当
System.arraycopy
将源数组的元素复制到目标数组时(无论它们是否为同一数组),它会复制对这些元素的引用,在您的情况下,这意味着对内部数组的引用

Orig.        dy   for:dx(1)      dx(2)      dx(3)
1 2 3      1 2 3      1 1 2      1 1 1      1 1 1
4 5 6   -> 1 2 3   -> 1 1 2   -> 1 1 1   -> 1 1 1
7 8 9      4 5 6      4 5 6      4 5 6      4 4 5