数组的值在没有赋值的情况下发生变化

时间:2016-10-18 01:42:07

标签: java

我正在使用这段代码在java中的2维矩阵中翻转一行。它似乎是一个如此简单的代码,但由于某种原因,它不起作用。矩阵的rowN最初是

112 42 83 119

成了

119 83 83 119

我调试了代码,发现tempMatrix2也在被更改。我不明白为什么。它在for循环中改变了我在为矩阵[rowN] [i]赋值的同一行。 任何帮助表示赞赏。

static int[][] flipRow(int[][] matrix, int rowN, int n) {
    int[] tempMatrix2 = matrix[rowN];

    for (int i = 0; i < n; i++) {
        matrix[rowN][i] = tempMatrix2[n-i-1];
    }

    return matrix;
}

1 个答案:

答案 0 :(得分:0)

在这种情况下,tempMatrix2和matrix指向堆内存中的相同位置。

如果更改矩阵中的数组值,它将反映在tempMatrix2中,反之亦然。

Original array {112, 42, 83, 119}

Here, n = 4
For example, let's say rowN = 0

When i = 0,
matrix[0][0] = tempMatrix[0][3];
The state is now:
matrix = {119, 42, 83, 119},
tempMatrix = {119, 42, 83, 119 }

When i = 1,
matrix[0][1] = tempMatrix[0][2];
Since tempMatrix[0][2] = 83, 
matrix = {119, 83, 83, 119},
tempMatrix = {119, 83, 83, 119 }

您需要创建一个新的整数数组对象并将其分配给tempMatrix2,然后将矩阵数组中的所有值复制到此新对象中,而不是执行tempMatrix2 = matrix。以下是我建议的方式:

static int[][] flipRow(int[][] matrix, int rowN, int n) {
    int[] tempMatrix2 = new int[n];

    for(int i = 0; i < n; i++) {
        tempMatrix2[i] = matrix[rowN][i];
    }

    for(int i = 0; i < n; i++) {
        matrix[rowN][i] = tempMatrix2[n-i-1];
    }

    return matrix;
}