在 Java 中使用数组作为方法的参数

Using an array as the parameter for a method in Java

我最近开始在 Java 中编码。以前我用C++作为我最常用的语言。

我一直在使用一些方法(C++中的函数)来解决一些算法问题。但是,根据我使用的参数类型,我发现会发生一些意想不到的事情。

当我使用 int 类型变量作为参数时,该方法完全符合我的预期。

变量b的值永远不会改变;该方法的结果仅应用于变量 c.

问题来了。当我使用 int 类型“array”作为参数时,会发生这种情况。

'''class 主 {

static int[] add_three(int[] input) {
    int[] result = input;
    result[3] += 3;
    return result;
}

public static void main(String[] args) {
    int[] b = {1, 2, 3, 4};
    for (int i = 0; i < 4; i++) System.out.print(b[i] + " ");
    System.out.println();

    int[] c = new int[4];
    for (int i = 0; i < 4; i++) {
        c[i] = b[i];
    }
    c = add_three(c);
    for (int i = 0; i < 4; i++) System.out.print(b[i] + " ");
    System.out.println();
    for (int i = 0; i < 4; i++) System.out.print(c[i] + " ");
    System.out.println();
}

}'''

方法'add_three' 不应更改数组b 的值。该方法的结果应该只应用于数组 c。 我期望的结果是:{1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 7}.

但是在调用add_three之后,我可以看到数组b 和c 都存储了该方法的结果。 听说在Java中使用数组作为方法的参数时,方法调用了数组的引用。所以我试图通过在方法中将参数复制为单独的数组来防止这种情况,但它不起作用。

任何人都可以解释这是怎么发生的,Java 是如何工作的,以及任何获得我实际预期结果的方法吗? 如果能将Java与C++进行比较,就更容易理解了。

谢谢!

传递数组就是传递引用。 underlying/targeted 数组保持不变。数组本身的变化随处可见。

C++ 复制它的所有参数。因此,C++ 还将创建传递的数组的两个完整副本

  1. 作为参数进入一个方法
  2. 通过 return x;
  3. 从方法返回
  4. (以及任何时候您为此使用赋值运算符 =

在Java中,只复制引用本身,不复制目标数组。

因此,您必须创建一个新数组,甚至可能将数据复制到其中,具体取决于您要如何使用它:

int[] copiedArray = new int[input.length];
System.arraycopy(input, 0, copiedArray, 0, input.length);

附带说明:请永远不要将代码粘贴为图像,像我一样将其作为文本插入,这样其他人如果想测试它就可以复制您的代码,并且不要不必手动 re-type 一切都可以帮助你。