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