java – 仅复制3D数组的前2个维度

我将以下3D数组设置为两个程序状态之间的缓冲区.

private boolean state [][][] = new boolean [20][20][2];

我正在尝试复制一切

state[0-19][0-19][1]

state[0-19][0-19][0]

目前我正在使用for循环,这很好,但我不禁觉得有更好的方法.我知道我可以使用两个单独的2D数组并做一个简单的复制,但我很想知道是否有任何解决方法.

电流回路:

for (int i=0;i<20;i++){
        for (int j=0;j<20;j++){
            state[i][j][0]=state[i][j][1];
    }
}

最佳答案 有时您可以使用System.arraycopy替换内部循环,然后更快.但我相信,不是你的记忆布局.

如果可能,请考虑更新引用,而不是复制数组.回想一下,java中的“多维”数组实际上是数组的数组.

特别是,

 boolean[] tmp = multi[0];
 multi[0] = multi[1];
 multi[1] = tmp;

以接近零的成本交换两个数组引用.这比复制快得多,然后覆盖旧值.但有时你需要一个副本(如果你不覆盖旧的值),那么你就不能这样做.

请注意,您不应盲目地这样做:

 multi[0][0] = 1;
 multi[1] = multi[0];
 multi[1][0] = 0;
 System.err.println(multi[0][0]);

将打印0,因为现在多[0]和多[1]指向相同的嵌套数组,你应该使用.

 multi[1] = multi[0].clone();

请注意,克隆也不深,因此multi.clone()将指向与multi相同的嵌套数组.在Java中没有内置的深度克隆或深度数组,你需要使用循环.

但同样,如果你想将第二个元素复制到许多数组中的第一个元素,那么这些都不会起作用.这是您的内存布局问题.

回想一下你的数据结构在内存中的样子:

 boolean[][][] -> boolean[][] -> boolean[]{ 0, 1 }
              \               \> boolean[]{ 0, 1 }
               \> boolean[][] -> boolean[]{ 0, 1 }
                              \> boolean[]{ 0, 1 }

你想复制每个数组中的一个元素.它们可以遍布你的内存(每个boolean [] …都是它自己的一个对象!),所以没有办法用基元来加速它 – 数据是分散的.如果可能的话,也许可以考虑更改内存布局.

还要考虑布尔数组的替代方法.布尔值占用1个字节的内存,但只存储一位(请注意,这可能会更快,因此本身也不错!).但有时将整个布尔数组存储在BitSet或long中是有意义的,然后使用实际的位操作.但获得,有时它确实付出,有时它会伤害.

点赞