在 Java 中声明数组而不使用“new”关键字

2022-09-01 12:51:13

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

int arr[] = new int [5];

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

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


答案 1

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

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

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

int[] blah = {}

但不是

int[] blah;
blah = {};

return {};

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


答案 2

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