之间有区别吗?
int[] b = new int[a.length];
b=a;
和
int[] b = a;
在java?
答案 0 :(得分:6)
它们大致相同,但存在一些差异:
b
最终都会引用与a
相同的数组,除了下面的警告。)a
为null
,则第一个会抛出NullPointerException
。OutOfMemoryError
或类似的。答案 1 :(得分:5)
假设a
的类型为int[]
并且不为空,那么......
在第一个代码段中,您创建一个新数组,然后将其丢弃。换句话说,通过将b
重新分配给a
,您创建的数组将无法访问,因此很快就会被垃圾回收。
两个代码段的行为方式不同的一种方式是,如果没有足够的堆空间来创建数组,在这种情况下,第一个代码段将为您提供OutOfMemoryError
,而第二个代码段则不会。当然,如果a
为空,那么第一个代码段将为您提供NullPointerException
。
但通常情况下,如果有足够的堆内存,并且如果a
不为空,那么您希望这两个代码段的行为相同。
答案 2 :(得分:2)
是。在第一种情况下,创建一个与a
长度相同的新空数组。
int[] b = new int[a.length];
您可能想要的是a
使用System.arraycopy()
所以
int[] b = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length);
在第二种情况下
int[] b = a;
创建了对数组a
的新引用。那是b
仅是对a
的引用。对其中任何一个的更改都会反映在另一个中。
答案 3 :(得分:0)
在第一种情况下:
int[] b = new int[a.length];
b=a;
执行第二行时,第一行中创建的数组将无用(符合垃圾回收条件)。 这实际上变成了:
int[] b = a;
(b == a)
在两种情况下都是正确的