Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java int[]b=newint[a.length]b=a和int[]b=a之间有区别吗?_Java - Fatal编程技术网

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

Java int[]b=newint[a.length]b=a和int[]b=a之间有区别吗?,java,Java,两者之间有区别吗 int[] b = new int[a.length]; b=a; 及 在java?中,它们基本相同,但有一些区别: 一般来说,第一个将创建一个数组,该数组立即变得不可访问(符合垃圾收集的条件),因此实际上不存在。(在这两个版本中,b最后引用的数组与a的数组相同,除了下面的注意事项。) 如果a为null,则第一个将抛出NullPointerException 如果你运气不好,第一个可能会抛出一个OutOfMemoryError或类似的错误 第一个更可能导致编译器警告、Fin

两者之间有区别吗

int[] b = new int[a.length];
b=a;


在java?

中,它们基本相同,但有一些区别:

  • 一般来说,第一个将创建一个数组,该数组立即变得不可访问(符合垃圾收集的条件),因此实际上不存在。(在这两个版本中,
    b
    最后引用的数组与
    a
    的数组相同,除了下面的注意事项。)
  • 如果
    a
    null
    ,则第一个将抛出
    NullPointerException
  • 如果你运气不好,第一个可能会抛出一个
    OutOfMemoryError
    或类似的错误
  • 第一个更可能导致编译器警告、FindBugs警告等
在第一种情况下:

int[] b = new int[a.length];
b=a;
执行第二行时,在第一行中创建的数组将无效(符合垃圾收集的条件)。 这实际上成为:

int[] b = a;

(b==a)
在这两种情况下均为真

假设
a
的类型为
int[]
且不为空,则

在第一个代码段中,创建一个新数组,然后将其丢弃。换句话说,通过将
b
重新分配给
a
,您创建的数组将无法访问,因此很快将被垃圾收集

两个代码段行为不同的一种方式是,如果没有足够的堆空间来创建数组,在这种情况下,第一个代码段将给您一个
OutOfMemoryError
,而第二个代码段则不会。当然,如果
a
为null,那么第一个代码段将为您提供
NullPointerException


但通常,如果有足够的堆内存,并且
a
不为null,那么您会期望这两个代码段的行为相同。

是。在第一种情况下,将创建一个与
a
长度相同的新空数组

int[] b = new int[a.length];
然后,您可能需要的是使用so的
a
的副本

在第二种情况下

int[] b = a;

将创建对数组
A
的新引用。也就是说,
b
只是对
a
的引用。对其中一项的更改将反映在另一项中。

如果您这样做
b=A
在第一条语句之后,第一条语句中分配的数组就被有效地丢弃了。
b=a
是下一行代码吗?或者你是说在第一行运行之前,
b
已经等于
a
?是的,第二行,我把所有这些命令放在一个方法中,它会导致difference@user2864740你能解释一下吗?int[]b=a call new function automatically?这是分配某个对象的新实例和指向某个对象的现有引用之间的区别。我正在查看其他(早期)答案,我真的很失望,似乎没有人注意到OP的代码让它看起来像是在复制数组
a
。我很高兴你打了这个(这样我就不用打了)+1.哇,如果你改变b,它会同时改变a……那么第一个方法是正确的吗?@user3495562这取决于你在做什么(以及为什么做)。@user3495562在Elliott所谓的“第二种情况”中,当你改变
b
时,它不会同时改变
a
。这就像说,“哇,如果我给塞缪尔·克莱门斯寄封信,那么马克·吐温也会收到一封。”。事实上,
a
b
最终成为完全相同数组的两个名称。
int[] b = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length);
int[] b = a;