创建后数组大小更改
任何人都可以解释这里发生的事情。 我的印象是,一旦创建并声明了数组的大小,就无法更改。
public class ArrayManipulation { public static void main(String[] args) { int a[] = {1, 2, 3};//new int[3]; int b[] = new int[a.length-1]; System.out.print("a = "); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); for (int i = 0; i < b.length; i++) b[i] = a[i]; //This is the bit I am confused about.. I was expecting an error here a = b; System.out.print("a = "); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } }
数组是对象,是的,一旦它们被创建,它们的大小就不会改变。
在线:
a= b;
你指向b
对象a
引用。 所以你引用的初始对象仍然在VM中,直到它被垃圾收集。
但是你的数组大小没有改变,但你引用的是指向一个不同的数组/对象
a
和b
都是int[]
类型。 所以a = b
只需将a = b
的值赋给a = b
的值。
在此赋值之后, a
和b
引用相同的数组,并且b
引用的初始数组可以由垃圾收集器收集,因为它不再被访问。
当您说a = b
时,您正在更改指向的引用。
由于数组是对象,因此设置一个等于另一个会更改引用。 两个数组仍然存在,但两个引用 – a
和b
– 都指向b
的位置。 实际删除数组a
的唯一方法是垃圾收集它。
你实际上并没有改变数组大小,它看起来就像它。
//This is the bit I am confused about.. I was expecting an error here a = b;
是的,你对正确的事感到困惑! a
和b
为自己分配了自己的内存。 使用a = b
您将指向为b
分配的内存。
也许将这些额外的sysout添加到代码中会有所帮助,请参阅输出:
public class ArrayManipulation { public static void main(String[] args) { int a[] = {1, 2, 3};//new int[3]; int b[] = new int[a.length-1]; System.out.print("a = "); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); for (int i = 0; i < b.length; i++) b[i] = a[i]; System.out.print("NEW -- before a=b. a = " + a); System.out.print("NEW -- before a=b. b = " + b); //This is the bit I am confused about.. I was expecting an error here a = b; System.out.print("NEW -- after a=b. a = " + a); System.out.print("NEW -- after a=b. b = " + b); System.out.print("a = "); for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } }