任何人都可以解释这里发生的事情。我的印象是数组的大小一旦创建并声明就无法更改。
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();
}
}
答案 0 :(得分:6)
数组是对象,是的,一旦它们被创建,它们的大小就不会改变。
在该行:
a= b;
您指向a
对象b
的引用。因此,a
引用的初始对象仍然在VM中,直到它被垃圾收集。
但是你的数组大小没有改变,但你引用的是指向一个不同的数组/对象
答案 1 :(得分:0)
a
和b
都属于int[]
类型。因此a = b
只需将a
的值指定为b
的值。
在此分配之后,a
和b
都引用相同的数组,垃圾收集器可以收集a
引用的初始数组它不能再被访问了。
答案 2 :(得分:0)
当您说a
时,您正在更改a = b
指向的引用。
由于数组是对象,因此设置一个等于另一个会更改引用。两个数组仍然存在,但两个引用 - a
和b
- 都指向b
的位置。实际删除数组a
的唯一方法是垃圾收集它。
你实际上并没有改变数组大小,它就像是它。
答案 3 :(得分:0)
//This is the bit I am confused about.. I was expecting an error here
a = b;
是的,你对正确的事感到困惑! a
和b
为自己分配了自己的内存。使用a = b
,您a
指向为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();
}
}