int数组初始化

uml*_*uml 22 java arrays int initialization default-value

我这里有一个与Java有关的简单问题.假设你有一个int数组作为实例变量:

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

所以,现在默认它包含5个零.但是如果你有与本地变量相同的数组呢?它被初始化为零吗?这不是作业,我正在学习Java语言.最好的祝福

Roh*_*ain 53

首先要理解的是,局部变量存储在堆栈上,这些变量未使用其默认值显式初始化.虽然实例变量存储在,他们是在默认情况下与他们的初始默认值.

此外,无论实例引用变量是保持其引用还是本地引用变量,都会在Heap上创建对象.


现在,当您将数组引用声明为局部变量时,会发生什么,并使用数组初始化它:

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

数组引用(in)存储在堆栈中,并为数组分配内存,该数组能够在堆上保存5个整数元素(请记住,在Heap上创建对象).然后,在Heap上分配用于存储数值的5个连续存储器位置.并且数组对象上的每个索引都按顺序保存对这些内存位置的引用.然后数组引用指向该数组.因此,由于在Heap上分配了5个整数值的内存,因此它们被初始化为其默认值.(size = 5)

而且,当您声明数组引用时,不要使用任何数组对象初始化它: -

int[] in;
Run Code Online (Sandbox Code Playgroud)

数组引用是在Stack上创建的(因为它是一个局部变量),但它默认情况下不会初始化为数组,也不会null像实例变量那样初始化.


因此,当您使用第一种数组声明和初始化方式时,这就是分配的样子: -

"Your array reference"
     "on stack"    

       |    |          "Array object on Heap"
       +----+                  
       | in |---------->  ([0, 0, 0, 0, 0])
       +----+
       "Stack"                  "Heap"
Run Code Online (Sandbox Code Playgroud)

  • *数组对象上的每个索引都按顺序保存对这些内存位置的引用。*并非如此。索引只是距数组起点的偏移量。 (4认同)

Ioa*_*oan 5

如果你这样做是同样的事情:

int[] in = new int[5]作为实例变量或局部变量.in在两种情况下,数组对象都将包含零.

区别在于你是否会这样做:

  1. 实例变量:int[] in; (它用null初始化),in对象将存在于堆空间中.

  2. 局部变量:int[] in; (它必须由用户初始化)将存在于堆栈中