5

我今天正在处理相对较大的String阵列。(大约 400 x 400 大小)我想知道如何使一个数组与另一个数组相等。例如,

String[][] array1 = new String[400][400];
String[][] array2 = array1;

使一个数组等于另一个数组与遍历每个元素并使其等于另一个数组中的相应位置相同吗?(如下所示)

for(int y = 0; y < 400; y++) {
    for(int x = 0; x < 400; x++) {
        array2[x][y] = array1[x][y];
    }
}

现在循环方法与使一个数组等于另一个数组相同吗?还是第一个/第二个比另一个快?就个人而言,我认为第一个会更快,因为没有递归或必须array2在递归之前手动分配内存。但是,我不知道从哪里开始寻找这些信息,我想了解 Java 如何处理这些事情的逻辑。

4

4 回答 4

12

不,这不是一回事:数组是引用对象,因此array2成为 的别名array1,而不是其副本。您对元素所做的任何分配都array2通过 变得“可见” array1,反之亦然。如果要复制一维数组,可以使用它的clone()方法;请注意,副本将很浅,即不会克隆数组的各个元素(使该技巧不适用于您在帖子中描述的二维数组)。

于 2012-08-13T02:58:32.930 回答
5

array2 = array1不复制元素,只复制数组引用。因此array2array1两者都引用了相同的底层数组。

这很容易自己确定:

String[][] array1 = new String[4][4];
array1[0][0] = "some string";
String[][] array2 = array1;
array1[0][0] = "another string";
System.out.println("array2: " + array2[0][0]);
array2[0][0] = "a third string";
System.out.println("array1: " + array1[0][0]);
于 2012-08-13T02:59:59.863 回答
1

嗯,我认为当您使一个数组等于另一个数组时,您只需更改引用即可。例如:

ARRAY 1 - * [][][][]...[][] 其中 * 是对 Array 1 的引用
Array 2 - & [][][][]...[][] 其中 & 是参考数组 2

然后设置 Array 1 = Array 2 Array 1 将简单地将其引用更改为 & 并开始读取内存引用 &

于 2012-08-13T03:01:13.420 回答
1

第一个代码示例中的第二行是创建一个 String [] 类型的引用变量,该变量引用引用 array1 所引用的同一个二维数组对象。内存中只有一个二维数组,但是有两个引用变量引用它,array1和array2。

您似乎对递归的定义感到困惑,因此我将在此处指出-计算机科学中的递归

于 2012-08-13T03:11:47.713 回答