int [] b = new int [a.length] b = a和int [] b = a?之间有区别吗?

时间:2014-06-26 03:18:23

标签: java

之间有区别吗?
int[] b = new int[a.length];
b=a;

int[] b = a;

在java?

4 个答案:

答案 0 :(得分:6)

它们大致相同,但存在一些差异:

  • 通常,第一个将创建一个立即无法访问的数组(符合垃圾回收条件),因此实际上不存在。 (在这两个版本中,b最终都会引用与a相同的数组,除了下面的警告。)
  • 如果anull,则第一个会抛出NullPointerException
  • 如果你运气不好,第一个可能会抛出一个OutOfMemoryError或类似的。
  • 第一个更可能导致编译器警告,FindBugs警告等。

答案 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)在两种情况下都是正确的