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