在Java中不使用'new'关键字来声明数组

时间:2016-08-19 06:38:46

标签: java arrays new-operator

以下两个声明之间有什么区别吗?

int arr[] = new int [5];

int arr1[] = {1,2,3,4,5};

是在堆栈上还是在堆上声明arr1

5 个答案:

答案 0 :(得分:32)

明显不同的是,一个全部为零,另一个包含[1..5]。

但这是唯一的区别。两者都是5元素的int数组,两者都以相同的方式分配。使用大括号声明并且没有new

仅仅是语法上的方便

请注意,此表单只能在声明数组时使用:

int[] blah = {}

但不是

int[] blah;
blah = {};

return {};

对象(数组是对象)在堆上分配。

答案 1 :(得分:8)

第一行将一个新对象放在堆-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需要大小来为堆上的新数组对象分配适当的空间。

答案 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}在相应条目中设置12

    < / LI>
  • 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位于heapArrays是java编程语言中的object type。官方文件here

相关问题