在 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
居住在 heap
。 Arrays
在 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}
在各自的条目中设置 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
有用的资料:
- Java: define terms initialization, declaration and assignment
下面两个声明有区别吗?
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
居住在 heap
。 Arrays
在 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}
在各自的条目中设置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
有用的资料:
- Java: define terms initialization, declaration and assignment