在 Java 中声明数组而不使用“new”关键字
2022-09-01 12:51:13
以下两个声明之间有什么区别吗?
int arr[] = new int [5];
和
int arr1[] = {1,2,3,4,5};
是在堆栈上还是在堆上声明?arr1
以下两个声明之间有什么区别吗?
int arr[] = new int [5];
和
int arr1[] = {1,2,3,4,5};
是在堆栈上还是在堆上声明?arr1
有一个明显的区别是,一个包含所有零,另一个包含[1..5]。
但这是唯一的区别。两者都是 5 元素 int 数组,两者都以相同的方式分配。用大括号声明而没有它只是语法上的便利。new
请注意,此表单只能在声明数组时使用:
int[] blah = {}
但不是
int[] blah;
blah = {};
或
return {};
对象(数组是对象)在堆上分配。
第一行将一个新对象放在堆上 - 一个包含四个元素的数组对象 - 每个元素包含一个默认值为0的int。
第二个执行相同的操作,但使用非默认值进行初始化。更深入,这一行做了四件事:
如果使用对象数组而不是基元:
MyObject[] myArray = new MyObject[3];
然后,堆上有一个数组对象,其中包含三个 MyObject 类型的空引用,但您没有任何 MyObject 对象。下一步是创建一些 MyObject 对象,并将它们分配给 myArray 引用的数组中的索引位置。
myArray[0]=new MyObject();
myArray[1]=new MyObject();
myArray[2]=new MyObject();
总之:数组在构造时必须始终给定其大小。JVM 需要大小才能在堆上为新数组对象分配适当的空间。