簡體   English   中英

修改本地var之外的變化?

[英]Modifying local vars changes outside vars?

我試圖了解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);
}

因為數組被視為對象的數組,在這種情況下,它們將引用的值傳遞給該方法,這導致該實現在傳遞給此方法的數組上起作用。

就像你會做的一樣

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;
}

為了進一步參考,您可以解決這個問題

您的int[] arr是對數組的引用。 該引用是傳遞給它的引用的副本,該引用不能更改。 但是,它所引用的數組不會被復制,並且在您對其進行修改時,這些更改對於調用者是可見的。

Java中的所有內容都是按值傳遞的。 如果我們談論的是非原始對象-對象變量以及數組,則變量的VALUE是指向對象的LINK。 我們無法重新分配鏈接,但是我們可以更改對象的內部。

事實是,當我們傳遞原語時,它們被保存在函數的Stack中,並且它們的更改不會影響方法調用中變量的值。 但是對象在堆中並且被共享。 因此,我們可以從調用堆棧的任何位置更改其內部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM