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

Muh*_*dri 25 java arrays new-operator

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

int arr[] = new int [5];
Run Code Online (Sandbox Code Playgroud)

int arr1[] = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

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

And*_*ner 32

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

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

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

int[] blah = {}
Run Code Online (Sandbox Code Playgroud)

但不是

int[] blah;
blah = {};
Run Code Online (Sandbox Code Playgroud)

要么

return {};
Run Code Online (Sandbox Code Playgroud)

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

  • @Muhammad取决于它.如果`int i = 10;`是局部变量声明,则堆栈中有10; 如果它是一个成员变量声明,它就在堆上.`Integer i = 10;`与`Integer.valueOf(10)`相同,所以`i`指的是堆的值. (2认同)
  • 将逃逸分析纳入其中并不一定能改善答案.EA甚至可能导致永远不会分配对象.实际上,术语"堆栈"和"堆"(像C这样的编程语言使用它的方式)与JVM所做的不匹配.最好说,包括数组的对象存储在*托管内存*中,忘记单词"stack"和"heap". (2认同)

小智 8

第一行将一个新对象放在堆-an数组对象上,该对象包含四个元素 - 每个元素包含一个默认值为0的int.

第二个相同,但使用非默认值初始化.更进一步,这一行做了四件事:

  • 声明一个名为arr1的int数组引用变量
  • 创建一个长度为五(五个元素)的int数组.
  • 使用值1,2,3,4,5填充数组的元素
  • 将新数组对象分配给引用变量arr1

如果使用对象数组而不是基元:

MyObject[] myArray = new MyObject[3];
Run Code Online (Sandbox Code Playgroud)

那么你在堆上有一个数组对象,有三个类型为MyObject的空引用,但你没有任何MyObject对象.下一步是创建一些MyObject对象,并将它们分配给myArray引用的数组中的索引位置.

myArray[0]=new MyObject();
myArray[1]=new MyObject();
myArray[2]=new MyObject();
Run Code Online (Sandbox Code Playgroud)

总之:数组在构造时必须始终给出一个大小.JVM需要大小来为堆上的新数组对象分配适当的空间.


fro*_*tto 5

有用的材料: