当前位置: 首页 > 知识库问答 >
问题:

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

宇文梓
2023-03-14

我正在尝试理解下面的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);
}

共有3个答案

别子实
2023-03-14

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

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

朱修德
2023-03-14

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

宋智明
2023-03-14

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

这就像你会做的一样

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

为了进一步的参考,你可以通过这个问题

 类似资料:
  • 问题内容: 假设我有一个全局变量。在函数定义中,我们还有一个名为的局部变量。有什么方法可以将全局变量的值分配给局部变量的值? 问题答案: 使用内置功能。 返回表示当前全局符号表的字典。 这始终是当前模块的字典(在函数或方法中,这是定义该模块的模块,而不是从中调用该模块的模块)。 顺便说一句,值得一提的是,全局只是模块范围内的“全局”。

  • 问题内容: 修改中的局部变量会产生编译错误: 正常 与Lambda 任何想法如何解决这个问题? 问题答案: 任何一种包装纸都是好的。 对于 Java 8+ ,请使用: …或数组: 使用 Java 10+ : 注意: 如果使用并行流, 请 非常小心。您可能无法获得预期的结果。诸如Stuart的其他解决方案可能更适合这些情况。 对于除 当然,这对于之外的其他类型仍然有效。您只需要将包装类型更改为或该类

  • 在中修改局部变量会导致编译错误: 典型的 和Lambda 你知道怎么解决这个问题吗?

  • 我正在使用Firebase fiRecovery来保存数据。我想检索用户所在的城市,并根据它,从firest中检索特定数据并设置RecyclView。问题是:当我进行查询时,我不能在OnCompleteListener之外获取变量(城市)。在(setUpRecyclView())中(userCity)下面的代码中是“”,以及OnCompleteListener之外的任何地方。我能做什么??这是我的