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;