在 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++ 还将创建传递的数组的两个完整副本
- 作为参数进入一个方法
- 通过
return x;
从方法返回
- (以及任何时候您为此使用赋值运算符
=
)
在Java中,只复制引用本身,不复制目标数组。
因此,您必须创建一个新数组,甚至可能将数据复制到其中,具体取决于您要如何使用它:
int[] copiedArray = new int[input.length];
System.arraycopy(input, 0, copiedArray, 0, input.length);
附带说明:请永远不要将代码粘贴为图像,像我一样将其作为文本插入,这样其他人如果想测试它就可以复制您的代码,并且不要不必手动 re-type 一切都可以帮助你。
我最近开始在 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++ 还将创建传递的数组的两个完整副本
- 作为参数进入一个方法
- 通过
return x;
从方法返回
- (以及任何时候您为此使用赋值运算符
=
)
在Java中,只复制引用本身,不复制目标数组。
因此,您必须创建一个新数组,甚至可能将数据复制到其中,具体取决于您要如何使用它:
int[] copiedArray = new int[input.length];
System.arraycopy(input, 0, copiedArray, 0, input.length);
附带说明:请永远不要将代码粘贴为图像,像我一样将其作为文本插入,这样其他人如果想测试它就可以复制您的代码,并且不要不必手动 re-type 一切都可以帮助你。