在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}在各个条目中设置12

  • 两者都在堆上 ,您可以保存它们的对象引用。

     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驻留在heapArrays是java编程语言中的object type 。 官方文件在这里