【问题标题】:Why isn't Java acting like "Pass-By-Value" here? [duplicate]为什么 Java 在这里表现得不像“按值传递”? [复制]
【发布时间】:2015-03-06 01:32:02
【问题描述】:

下面 main 的输出是 [5,4,3,2,1] [1,2,3,4,5]

这对我来说毫无意义。是的,我第一次运行“reverseArrayIteratively”时,我肯定期待 [5,4,3,2,1] 所以这是正确的输出,但是在第二个函数(reverseArrayRecursively)之后,我期待它也返回 [ 5,4,3,2,1] 因为 Java 应该是“按值传递”,所以我没想到“reverseArrayIteratively”实际上会围绕 myIntArray 的值发生变化。我认为无论我调用 reverseArrayIteratively 或 reverseArrayRecursively 多少次,main 中的 myIntArray 都会保持 [1,2,3,4,5] 。这里发生了什么?

public static void main(String[] args) {
        // TODO Auto-generated method stub  
        int[] myIntArray = {1,2,3,4,5};
        System.out.println(Arrays.toString(reverseArrayIteratively(myIntArray, 0, myIntArray.length-1)));
        System.out.println(Arrays.toString(reverseArrayRecursively(myIntArray, 0, myIntArray.length-1)));
    }

    public static int[] reverseArrayIteratively(int[] array, int first, int end) {
        while (first < end) {
            int temp = array[end];
            array[end] = array[first];
            array[first] = temp;
            first++;
            end--;
        }
        return array;   
    }   

    public static int[] reverseArrayRecursively(int[] array, int first, int end) {
        int temp = array[end];
        array[end] = array[first];
        array[first] = temp;
        first++;
        end--;
        if (first < end) {
            reverseArrayRecursively(array, first, end);
        }
        else {
            return array;
        }
        return array;
    }

【问题讨论】:

    标签: java parameter-passing pass-by-value


    【解决方案1】:

    它表现为按值传递。我认为,您的困惑源于这对非原始参数的含义(数组是对象,而不是原始参数)。对于对象参数,按值传递的始终是对象的引用。在您的递归方法中,您正在修改数组参数的元素,因此它当然是在调用代码中将数组元素更改回。

    如果您有 C++ 背景,请将 Java 引用视为 C++ 指针,而不是 C++ 引用。

    【讨论】:

    • 我喜欢称之为按值传递引用
    • 如果他创建一个新数组并返回它,他的原始数组会保持不变吗?
    • @BenKnoble - 是的,原版会保持不变。但是新数组不是预期的,因为每次递归调用都会创建一个新数组,因此所有超出初始调用的递归都不会以应有的方式影响返回的数组。
    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2014-05-27
    • 2019-10-28
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多