无法理解下面的代码中发生了什么。数组的行为c
是d
我所期望的。a
但是和是怎么回事b
?(我也用正常的标量变量尝试了这个,在这两种情况下都没有发生令人惊讶的事情。)
输出被复制到 RH 注释。
import java.util.Arrays;
public class ArraysParadox {
public static void main(String[] args) {
int[] c = {1, 2, 3};
int[] d = {6, 5, 4, 3};
System.out.print("c: ");
System.out.println(Arrays.toString(c)); // c: [1, 2, 3]
System.out.print("d: ");
System.out.println(Arrays.toString(d)); // d: [6, 5, 4, 3]
System.out.println("--- swap ---");
int[] tmp = c;
c = d;
d = tmp; // <----- Magic?
System.out.print("c' (=d): ");
System.out.println(Arrays.toString(c)); // c' (=d): [6, 5, 4, 3]
System.out.print("d' (=c): ");
System.out.println(Arrays.toString(d)); // d' (=c): [1, 2, 3]
System.out.println("--- c = 0 ---");
Arrays.fill(c, 0);
System.out.print("c (=0): ");
System.out.println(Arrays.toString(c)); // c (=0): [0, 0, 0, 0]
System.out.print("d (=c): ");
System.out.println(Arrays.toString(d)); // d (=c): [1, 2, 3]
System.out.println("--- d = 1 ---");
Arrays.fill(d, 1);
System.out.print("c (=d): ");
System.out.println(Arrays.toString(c)); // c (=d): [0, 0, 0, 0]
System.out.print("d (=1): ");
System.out.println(Arrays.toString(d)); // d (=1): [1, 1, 1]
System.out.println("================");
int[] a = {1, 2, 3};
int[] b = {6, 5, 4, 3};
System.out.print("a: ");
System.out.println(Arrays.toString(a)); // a: [1, 2, 3]
System.out.print("b: ");
System.out.println(Arrays.toString(b)); // b: [6, 5, 4, 3]
a = b;
System.out.print("a (=b): ");
System.out.println(Arrays.toString(a)); // a (=b): [6, 5, 4, 3]
System.out.println("--- α = 0 ---");
Arrays.fill(a, 0);
System.out.print("a (=0): ");
System.out.println(Arrays.toString(a)); // a (=0): [0, 0, 0, 0]
System.out.print("b (=a?): ");
System.out.println(Arrays.toString(b)); // b (=a?): [0, 0, 0, 0] ???
System.out.println("--- b = 1 ---");
Arrays.fill(b, 1);
System.out.print("b (=1): ");
System.out.println(Arrays.toString(b)); // b (=1): [1, 1, 1, 1]
System.out.print("a (=b?): ");
System.out.println(Arrays.toString(a)); // a (=b?): [1, 1, 1, 1]
}
}
根据这篇文章的可交换性c
和d
表示按值传递:Java is Pass-by-Value, Dammit!. (我也看了java array pass by reference does not work?,但是我看不懂提问者的英文,方法调用遮盖了例子。)
请注意,该行已被d = tmp;
注释掉,c
并表现出与和d
相同的奇怪行为。我仍然不知道该怎么做。a
b
谁能解释如何用传递值来解释a
和的行为?b
编辑:附录
事实证明,我帖子中的主要问题不是按值传递,而是别名。为了清楚按值传递和指针之间的区别,我在我的代码中添加了以下方法,并用它来(尝试)交换c
和d
(由上面链接的 JavaDude 的文章链接的文章建议)。
static <T> void swap (T c, T d) {
T tmp = c;
c = d;
d = tmp;
}
结果就是这样c
,d
回来不变。如果 Java(如 C)传递指向c
和指向d
方法的指针,这将起作用,但它只是简单地传递它们的值,而原始变量保持不变。
更改a = b
为a = b.clone();
或更改为a = Arrays.copyOf(b, b.length);
我所期望的行为。此代码也适用:
int[] tmp = new int[b.length];
System.arraycopy( b, 0, tmp, 0, b.length );
a = tmp;
此处描述的相对时间。