Java阵列复制和2D阵列复制混淆

时间:2016-03-17 23:41:16

标签: java arrays

public static void reverseArray(int[] arr) {
    int[] reversed = new int[arr.length];
    for (int i = arr.length - 1; i > -1; --i) {
        reversed[arr.length - i - 1] = arr[i];
    }
    arr = reversed;
}

这里我有一个反向数组方法。如果我打电话

int[] v = new int[] {1, 2, 3, 4};
reverseArray(v);
//print v

我会得到“1 2 3 4”

但是如果我将reverseArray函数更改为

public static void reverseArray(int[] arr) {
    int[] reversed = new int[arr.length];
    for (int i = arr.length - 1; i > -1; --i) {
        reversed[arr.length - i - 1] = arr[i];
    }
    for (int i = 0; i < arr.length; ++i) { 
      arr[i] = reversed[i];
    } 
}

它将按预期工作并打印出“4 3 2 1”为什么没有“arr =逆转”;工作?它们都是指针,所以如果我将一个指定给另一个,它应该指向与2D数组相同的对象。如果我做

int[][] mat = //some assignment

public void reverseMatrix() {
        reverseAllRows();
        int[][] c = new int[mat.length][mat[0].length];
        for (int i = 0; i < mat.length; ++i) {
            c[mat.length - 1 - i] = mat[i];
        }
        mat = c; //This works for some reason
}

它不需要我复制每个元素就可以工作。为什么这样,我怎么知道何时使用equals以及何时不使用?

2 个答案:

答案 0 :(得分:1)

您需要做的是返回数组:

public static int[] reverseArray(int[] arr) 
{
    int[] reversed = new int[arr.length];
    for (int i = arr.length - 1; i > -1; --i) 
    {
        reversed[arr.length - i - 1] = arr[i];
    }
    return reversed;
}

然后你将调用函数:

int[] v = new int[] {1, 2, 3, 4};
v = reverseArray(v);
//print v

答案 1 :(得分:0)

Java是一种Pa​​ss-By-Value语言。这就是原因。传递引用并将该引用分配给其他对象时,调用方的原始引用不会更改。因此,调用者无法看到变化。