在vars之外修改本地变量?

时间:2016-01-20 15:28:48

标签: java sorting scope quicksort

我试图了解QuickSort的以下实现如何在Java中运行。我已经掌握了大部分内容,但我很困惑它是如何做任何事情的。当你将一个变量传递给一个函数并对其进行修改时,它通常不会修改传入的原始变量。那么为什么这个没有返回类型的quicksort实现会修改传入的数组呢?

public static void quickSort(int[] arr, int low, int high) {
    if (arr == null || arr.length == 0)
        return;

    if (low >= high)
        return;

    int middle = low + (high - low) / 2;
    int pivot = arr[middle];

    // make left < pivot and right > pivot
    int i = low, j = high;
    while (i <= j) {
        while (arr[i] <pivot) {
            i++;
        }

        while (arr[j] > pivot) {
            j--;
        }

        if (i <= j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }

    if (low < j)
        quickSort(arr, low, j);

    if (high > i)
        quickSort(arr, i, high);
}

3 个答案:

答案 0 :(得分:4)

因为数组被视为Object,并且在这种情况下它们将引用的值传递给方法,这导致此实现对传递给此方法的数组起作用。

就像你要做的那样

public void test(ObjectA obj) {
    obj.setVal(1);
}

在这种情况下,您将处理传递的ObjectA,并且还会在此实例上调用方法setVal。在这种情况下,在方法test内调用的方法也会反映在此特定对象的传递实例内的更改(因为它是相同的实例)。

数组

也是如此
public static void main(String args[]) {
   int[] arr = {1,2,3};
   test(arr);
   System.out.println(arr[0]); // This would print 13 now.
}

public static void test(int[] arr) {
   arr[0] = 13;
}

如需进一步参考,您可以浏览this question

答案 1 :(得分:2)

您的int[] arr是对数组的引用。此引用是传递给它的引用的副本,并且该引用不能更改。但是,它引用的数组不会被复制,当您修改它时,调用者可以看到这些更改。

答案 2 :(得分:1)

Java中的所有内容都是按值传递的。如果我们讨论的是非基元 - 对象变量以及数组,则变量的VALUE是对象的LINK。 我们无法重新分配链接,但我们可以更改对象的内部。

问题在于,当我们传递基元时 - 它们保存在函数的堆栈中,它们的更改不会影响方法调用中变量的值。 但是对象在Heap中并且它们是共享的。所以我们可以从调用堆栈的任何位置更改它的内部。