我给出了以下方法,该方法应该交换作为参数传递给方法的数组的前两个元素:
public void exchange(int[] a){
int c[] = new int[a.length];
c[0] = a[1];
c[1] = a[0];
for(int i = 2; i < a.length; i++)
c[i] = a[i];
a = c;
}
为什么这种方法不能按预期工作?
起初我以为我是因为c的范围仅限于该方法,参考分配a = c在该函数之外不会产生任何影响,但即使我使用c作为一个函数,该方法也不起作用附加参数。谁能告诉我为什么这种方法不起作用呢?
答案 0 :(得分:2)
那是因为java参数总是pass-by-value
。
在您的示例中,您传递对对象的引用,但是此引用是按值传递的。换句话说,创建新的局部变量a
并使用对数组的引用进行初始化。
如果你想交换两个值,你可以这样做:
public void exchange(int[] a){
int temp = a[0];
a[0] = a[1];
a[1] = temp;
}
但如果你这样做:
public void exchange(int[] a){
a = new int[10];
}
然后只有局部变量a
引用新数组。
答案 1 :(得分:2)
此方法无效,因为此行
a = c;
更改传递给int[]
函数的exchange
引用的值,而不触及引用的数组,因为对象引用是按值传递的。如果您想更改a
的内容,请通过临时变量切换其元素,或使用arrayCopy
方法或循环将c
复制到a
。< / p>
这是一个非常简单的实现,它交换了数组的两个初始元素:
public void exchange(int[] a) {
if (a.length < 2) return;
int tmp = a[0];
a[0] = a[1];
a[1] = tmp;
}
请注意检查代码中缺少的最小长度。当将零个或一个元素的数组传递给exchange
方法时,它会阻止异常。
答案 2 :(得分:2)
您可以避免因不创建新数组而更改引用。这将更简单,更快,更快。
public static void exchange(int[] a) {
int tmp = a[0];
a[0] = a[1];
a[1] = tmp;
}
您无法在Java中更改被调用方法中的参数,只能更改参数所指向的对象。
答案 3 :(得分:2)
它不起作用,因为a只是对数组的复制引用,对a的更改,如[0] = 1;反映在调用方法中,因为您正在更改引用的目标(即数组)而不是引用本身。 a = c,不起作用,因为它只更改对数组的本地引用而不是调用方法中的引用。 请在此处查看更详尽的解释:Is Java "pass-by-reference" or "pass-by-value"?
要将第一个交换为值,只需执行以下操作:
int temp = a[0];
a[0] = a[1];
a[1] = temp;
答案 4 :(得分:2)
您还可以返回更改的数组:
public int[] exchange(int[] a){
int c[] = new int[a.length];
c[0] = a[1];
c[1] = a[0];
for(int i = 2; i < a.length; i++)
c[i] = a[i];
return c;
}
并以这种方式使用此方法:
a = exchange(a);