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

Declaring arrays without using the 'new' keyword in Java

下面两个声明有区别吗?

int arr[] = new int [5];

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

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

明显的区别是一个全为零,另一个包含[1..5]。

但这是唯一的区别。两者都是 5 元素 int 数组,两者的分配方式相同。用大括号声明只是语法上的方便,没有 new.

注意这个形式只能在声明数组的时候使用:

int[] blah = {}

但不是

int[] blah;
blah = {};

return {};

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

Objects 居住在 heapArrays 在 java 编程语言中是 object type。官方文档 here

第一行将一个新对象放在堆上——一个包含四个元素的数组对象——每个元素包含一个默认值为 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 需要大小才能在堆上为新数组对象分配适当的 space。

我同意其他答案,到目前为止,您的数组最常分配在堆上(无论您使用这两个声明中的哪一个)。然而,根据 Can Java allocate a list on stack? 中的最佳答案,“在特殊情况下,java 虚拟机可能会执行逃逸分析并决定分配对象……在堆栈上”。我相信这是真的。所以你的问题的答案是:这取决于。通常在堆上。

  • new int [5] 可用于 assignment and initialization, but {1, 2} only can be used as declaration with initialization。 (注意 new int[] {1, 2} 也可以用作 赋值 初始化

  • new int [5] 将所有条目设置为零,但 {1, 2}new int[] {1, 2} 在各自的条目中设置 12

  • 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
    

有用的资料:

  • Java: define terms initialization, declaration and assignment