数组和引用

时间:2014-04-23 16:43:55

标签: java arrays

请考虑以下代码:

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>

3 个答案:

答案 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开始,这是新数组。原始的一个仍然存在(虽然它无法访问),直到它被收集垃圾。