请考虑以下代码:
public static void resize(int[] x){
x = new int[x.length*2];
System.out.println(x.length + " ");
}
public static void main(String[] args){
int[] x = {1,2};
resize(x);
System.out.println(x.length);
}
输出为“4 2”。问题是:我认为当我们在新长度的代码中定义一个数组时,另一个数组(前一个长度为2的数组)将被丢弃,因为现在数组的值指向“更大”的数组。那么,为什么然后在最后打印出长度2?我使用Arrays.toString来验证,实际上,void方法之后的数组的实际值是{1,2}。这是令人困惑的,因为我认为数组本身会被更改,因为值是指向内存地址的指针(与在char / int变量上使用方法相比,这不会影响变量的值)。 / p>
答案 0 :(得分:1)
当您调用resize
时,将数组对象传递给该方法。这是您的计划的基本流程:
initialize array of size 2
pass that array to resize()
resize has a reference to the value of the array
resize points it's reference to a new array twice the size of the old reference
prints "4"
main() prints the size of the initial array "2"
您不会在新方法中更改原始数组,它只有一个具有相同值的数组。
答案 1 :(得分:0)
由于Java通过值,因此调用resize后数组不会更改。 (我假设输出实际上是4 2
,而不是2 4
。)
如果要调整大小以实现永久性更改,则应将方法返回x; 作为其最终语句(或使用全局变量):
public static int[] resize(int[] x){
x = new int[x.length*2];
System.out.println(x.length + " ");
return x;
}
public static void main(String[] args){
int[] x = {1,2};
x = resize(x);
System.out.println(x.length);
}
答案 2 :(得分:0)
x
resize
变量的scope
public static void resize(int[] x){
x = new int[x.length*2];
}
是本地到该功能。它不会影响传入的x
。这意味着只要resize
完成,该本地副本就会消失并最终被垃圾收集。
如果要调整原始阵列的大小,请将其返回。例如:
public static int[] getNewArrayOfDoubleLength(int orig_length){
return new int[orig_length * 2];
}
并用
调用它x = getNewArrayOfDoubleLength(x.length);
从arrays are immutable开始,这是新数组。原始的一个仍然存在(虽然它无法访问),直到它被收集垃圾。