以下两个声明之间有什么区别吗?
int arr[] = new int [5];
和
int arr1[] = {1,2,3,4,5};
是在堆栈上还是在堆上声明arr1
?
答案 0 :(得分:32)
明显不同的是,一个全部为零,另一个包含[1..5]。
但这是唯一的区别。两者都是5元素的int数组,两者都以相同的方式分配。使用大括号声明并且没有new
。
请注意,此表单只能在声明数组时使用:
int[] blah = {}
但不是
int[] blah;
blah = {};
或
return {};
对象(数组是对象)在堆上分配。
答案 1 :(得分:8)
第一行将一个新对象放在堆-an数组对象上,该对象包含四个元素 - 每个元素包含一个默认值为0的int。
第二个做同样的事情,但用非默认值初始化。更进一步,这一行做了四件事:
如果使用对象数组而不是基元:
MyObject[] myArray = new MyObject[3];
然后你在堆上有一个数组对象,有三个MyObject类型的空引用,但你没有任何MyObject对象。下一步是创建一些MyObject对象并将它们分配给myArray引用的数组中的索引位置。
myArray[0]=new MyObject();
myArray[1]=new MyObject();
myArray[2]=new MyObject();
总之:数组在构造时必须始终给出一个大小。 JVM需要大小来为堆上的新数组对象分配适当的空间。
答案 2 :(得分:5)
new int [5]
可用于 assignment 和 initialization ,但{1, 2}
只能用于用作 declaration with initialization 。 (请注意,new int[] {1, 2}
也可用作分配和初始化)
new int [5]
将所有条目设置为零,但{1, 2}
和new int[] {1, 2}
在相应条目中设置1
和2
。
Both are on heap,您可以保存对象参考。
int arr[] = new int [5];
// arr: object reference to the array
或
int arr[] = {1, 2, 3, 4, 5};
// arr: object reference to the array
有用的资料:
答案 3 :(得分:4)
我同意其他答案,到目前为止,最常用的数组将在堆上分配(无论你使用哪两个声明)。但是,根据Can Java allocate a list on stack?中的最佳答案,“在特殊情况下,java虚拟机可能会执行转义分析并决定在堆栈上分配对象”。我相信这是真的。所以你的问题的答案是:这取决于。通常在堆上。
答案 4 :(得分:3)
Objects
位于heap
。 Arrays
是java编程语言中的object type
。官方文件here