我有一段代码给了我意想不到的输出。我相信这与存储空间有关,正如我在下面的输出中所描述的那样。但我不确定。
代码:
public static void main(String[] args) {
int [] x = {1,2};
int [] y = plusOne(x);
System.out.println(x[0] + " " + x[1]);
System.out.println(y[0] + " " + y[1]);
}
public static int [] plusOne(int [] x) {
System.out.println("x :"+ x);
int [] y = x;//1 2
x = new int [x.length];
System.out.println("y: "+y);
for (int i=0; i<y.length;i++){
x[i] = y[i];
}
for (int i=0; i<y.length;i++){
y[i] = y[i] + 1;
}
return y;
}
预期产出:
1 2
2 3
实际输出:
2 3
2 3
从我发现的是分配两个整数时。即int x = y,这会导致x的存储位置被分配给y的存储位置,因为它们没有被正确初始化。但我并非百分百肯定,我在这里写的就是我所能找到的。
答案 0 :(得分:0)
您正在覆盖方法x[]
中的plusOne()
数组。以下示例代码将实现您最初的想法:
public static int[] plusOne(int[] x) {
int[] y = new int[x.length];
System.arraycopy(x, 0, y, 0, x.length);
for (int i=0; i < x.length; ++i) {
y[i] = x[i] + 1;
}
return y;
}
在这里,我将输入数组x[]
复制到一个新数组y[]
中,然后将y[]
初始化为x[]
加一个添加。
plustOne()
方法中的以下代码是您的问题的根源:
int [] y = x;
for (int i=0; i < y.length; ++i) {
y[i] = y[i] + 1;
}
您指定y[]
指向x[]
存在外 main()
中的方法调用,然后取消引用数组并将其内容增加一。所以x[]
数组加1,并且方法返回x[]
加1。
答案 1 :(得分:0)
更改
int [] y = x;
到
int [] y = x.clone();
<强>解释强>
要了解最新情况,请在主要方法上添加以下声明
System.out.println(x+ ""+ y);
在第一种情况下,您将看到x和y都具有相同的id,因为赋值运算符只是将引用赋予原始数组。
在第二种情况下,您会看到x和y的不同ID。 Becasue clone()函数创建原始数组的副本。