为了账号安全,请及时绑定邮箱和手机立即绑定

System.ArrayCopy 如何复制数组的数组?

System.ArrayCopy 如何复制数组的数组?

元芳怎么了 2023-08-04 17:36:38
假设我有以下数组声明:new double[][] {new double[] {1, 2, 3}, new double[] {4,5,6}, new double[] {7,8,9}}我想将数组的内容在给定方向上“翻译”(移动)固定量,将现有内容保留在未覆盖的单元格中 - 例如:1 2 3                                1 1 24 5 6   Shifted by +1 in x becomes:  4 4 57 8 9                                7 7 81 2 3                                1 2 34 5 6   Shifted by +1 in y becomes:  1 2 37 8 9                                4 5 6我可以使用 System.arraycopy 相当轻松地完成这些操作:按 dy 移位:boolean b2t = dy<0; // bottom to top movementdy = 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 平移:boolean l2r = dx>0; // left to right movementdx = Math.abs(dx);for (double[] i : a){    if (l2r)    {        System.arraycopy(i, 0, i, dx, (i.length-dx));    }    else    {        System.arraycopy(i, dx, i, 0, (i.length-dx));       }}   当我尝试同时做这两件事时,有趣的行为就会出现(例如dx = 1 and dy = 1)。如果我按照所示顺序使用上面的代码(dy 然后 dx),则复制的数组似乎在 for 循环迭代中针对从中复制的数组进行了更新。例如,对于 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 14 5 6   -> 1 2 3   -> 1 1 2   -> 1 1 1   -> 1 1 17 8 9      4 5 6      4 5 6      4 5 6      4 4 5正如您所看到的,在转换for循环期间dx,它将第一行和第二行视为同一个对象;因此应用转换两次 - 两次将其应用到两个数组。System.arraycopy 的文档指出:如果 src 和 dest 参数引用相同的数组对象,则执行复制操作,就好像位置 srcPos 到 srcPos+length-1 处的组件首先被复制到具有 length 组件的临时数组中,然后临时数组的内容被复制到复制到目标数组的 destPos 到 destPos+length-1 位置。换句话说,当dy转换完成时,顶部两行被复制到一个单独的临时数组,然后返回到主数组,a但处于移位的位置。在我看来,它是将 复制reference到数组,而不是数组本身 - 这是发生了什么吗?无论如何,我可以通过交换代码来解决这个问题,这样它就可以在 dy 之前进行 dx 转换;但确认这里发生的事情会很有趣;因为如果我想将其扩展为 3 个维度,我将无法仅仅通过重新排列它来使其发挥作用。
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

是的,就是复制参考文献。

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

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


查看完整回答
反对 回复 2023-08-04
  • 1 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信