Java 数组和引用

Java 数组和引用,java,arrays,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”。问题是:我认为当我们在新长度的代码中定义一个数组时,另一个数组(

考虑以下代码:

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变量使用该方法不同,它不会影响变量的值)。

当调用
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"

在新方法中,您不会更改原始数组,它只是有一个相同值的数组。

因为Java经过值,所以在调用resize之后,数组不会更改。(我假设输出实际上是
42
,而不是
24

如果要调整大小以实现永久更改,则应使用方法返回x作为其最终语句(或使用全局变量):

resize

public static void resize(int[] x){
   x = new int[x.length*2];
}
是该函数的局部。它不会影响传入的
x
。这意味着,只要
调整大小
完成,本地副本就会消失,并最终被垃圾收集

如果要调整原始数组的大小,请返回它。例如:

public static int[] getNewArrayOfDoubleLength(int orig_length){
   return  new int[orig_length * 2];
}
并称之为

x = getNewArrayOfDoubleLength(x.length);

因为,这是一个新的数组。原来的一个仍然存在(尽管无法访问),直到它被垃圾回收。

跟着我重复;Java总是按值传递,Java总是按值传递,Java总是按值传递,Java总是按值传递,Java总是按值传递……那么,如果我们将
x[0]
x[1]
设置为其他值(不定义新数组),然后在最后打印它,我们将得到“修改后的值”,我们将如何解释这一事实呢?或者,当我们将x的相等值设置为一个更大的数组时,我们会用不同的引用创建一个“新数组”吗?(然后,通过垃圾收集消除)然后,如果我们有一个方法作为新数组的返回值(并将其设置为x),那么我们将有一个新数组,因为变量x专门指向这个较新的数组?请尝试按照提供的关于这是一个重复问题的链接,它回答了所有这些:)
x = getNewArrayOfDoubleLength(x.length);