以下两个声明之间有什么区别吗?
int arr[] = new int [5];和
int arr1[] = {1,2,3,4,5};arr1是在堆栈上声明的还是在堆上声明的?
发布于 2016-08-19 06:42:03
有一个明显的区别,一个有所有的零,而另一个包含1.5。
但这是唯一的区别。两者都是5元素int数组,都是以相同的方式分配的.用大括号声明只是语法上的方便,而没有new。
请注意,只有在声明数组时才能使用此表单:
int[] blah = {}但不是
int[] blah;
blah = {};或
return {};在堆上分配对象(数组是对象)。
发布于 2016-08-19 06:56:13
第一行在堆-an数组对象上放置一个新对象,其中包含4个元素,每个元素包含默认值为0的int。
第二种方法也是这样,但使用非默认值进行初始化。再往下看,这条单行做了四件事:
如果您使用对象数组而不是原语:
MyObject[] myArray = new MyObject[3];然后堆上有一个数组对象,其中有三个类型为MyObject的空引用,但是没有任何MyObject对象。下一步是创建一些MyObject对象,并将它们分配给myArray引用的数组中的索引位置。
myArray[0]=new MyObject();
myArray[1]=new MyObject();
myArray[2]=new MyObject();总之:数组在构造时必须始终给定大小。JVM需要大小来为新数组对象在堆上分配适当的空间。
发布于 2016-08-19 07:38:04
我同意其他答案,到目前为止,在堆上分配数组的次数最多(无论使用哪两个声明)。但是,根据Java可以在堆栈上分配列表吗?中的最上面的答案,“在特殊情况下,java虚拟机可以执行转义分析,并决定分配对象…。一堆“。我相信这是真的。所以你的问题的答案是:视情况而定。通常在堆里。
https://stackoverflow.com/questions/39032577
复制相似问题