Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在变量外部修改本地变量?_Java_Sorting_Scope_Quicksort - Fatal编程技术网

Java 在变量外部修改本地变量?

Java 在变量外部修改本地变量?,java,sorting,scope,quicksort,Java,Sorting,Scope,Quicksort,我试图理解下面的QuickSort实现在Java中是如何工作的。我已经掌握了大部分,但我很困惑它到底是怎么做的。当您将变量传递给函数并对其进行修改时,它通常不会修改传递的原始变量。那么,为什么这个没有返回类型的快速排序实现会修改传入的数组呢 public static void quickSort(int[] arr, int low, int high) { if (arr == null || arr.length == 0) return; if (low

我试图理解下面的QuickSort实现在Java中是如何工作的。我已经掌握了大部分,但我很困惑它到底是怎么做的。当您将变量传递给函数并对其进行修改时,它通常不会修改传递的原始变量。那么,为什么这个没有返回类型的快速排序实现会修改传入的数组呢

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);
}
publicstaticvoidquicksort(int[]arr,int-low,int-high){
如果(arr==null | | arr.length==0)
返回;
如果(低>=高)
返回;
int middle=低+(高-低)/2;
int pivot=arr[中间];
//使左<枢轴和右>枢轴
int i=低,j=高;

而(i),因为数组被视为对象,在这种情况下,它们将引用的值传递给方法,这导致此实现在传递给此方法的数组上工作

这和你想做的一样

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

为了进一步参考,您可以浏览,因为数组被视为对象,在这种情况下,它们将引用的值传递给方法,这将导致此实现在传递给此方法的数组上工作

这和你想做的一样

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
是对数组的引用。此引用是传递给它的引用的副本,并且该引用无法更改。但是,它引用的数组不会被复制,当您修改它时,调用方可以看到这些更改。

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

Java中的所有内容都是按值传递的。如果我们讨论的是非原语-对象变量除了数组之外,变量的值也是指向对象的链接。 我们不能重新分配链接,但可以更改对象的内部结构

问题是,当我们传递原语时,它们被保存在函数堆栈中,它们的更改不会影响方法调用中变量的值。
但是对象在堆中,它们是共享的。因此,我们可以从调用堆栈的任何位置更改其内部结构。

Java中的所有内容都是按值传递的。如果我们讨论的是非原语-对象变量以及数组,则变量的值是指向对象的链接。 我们不能重新分配链接,但可以更改对象的内部结构

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

Hm的可能副本有趣的是,我不知道Java传递的引用和值。我将阅读该线程,谢谢!@Nathan它不直接传递引用,只传递引用的值。这可能是conf使用来考虑。但是当你重新分配一个参数时,你会注意到这一点,比如本例中的
arr
。引用值的更改只会在方法中通知,而不会从调用方通知(如果java是按引用传递的话,这会起作用)。哦,我想我明白了。我将继续使用它:)嗯,有趣的是,我不知道Java传递了引用和值。我将阅读该线程,谢谢!@Nathan它不直接传递引用,只传递引用的值。这可能会让人感到困惑。但是当你重新分配参数时,你会注意到这一点,比如在本例中,
arr
。引用值的更改将继续我在方法中应该是可通知的,而不是来自调用方(如果java是通过引用传递的,这会起作用)