int数组初始化
我这里有一个与Java有关的简单问题。 假设你有一个int数组作为实例变量:
int[] in = new int[5];
所以,现在默认它包含5个零。 但是如果你有与本地变量相同的数组呢? 它被初始化为零吗? 那不是作业,我正在学习Java语言。 最好的祝福
首先要理解的是, 局部变量存储在堆栈上 ,这些变量未使用其默认值显式初始化。 实例变量存储在Heap中 ,默认情况下使用默认值初始化它们。
此外,无论实例引用变量是保持其引用还是本地引用变量,都会在Heap上创建对象 。
现在,当你将这样的数组引用声明为局部变量时,会发生什么,并用数组初始化它:
int[] in = new int[5];
数组引用(in)
存储在堆栈中 ,并为数组分配内存,该数组能够在堆上保存5个整数元素(请记住,在Heap上创建对象)。 然后,在Heap上分配用于存储整数值的5个连续存储器位置(size = 5)
。 并且数组对象上的每个索引都按顺序保存对这些内存位置的引用 。 然后数组引用指向该数组。 因此,由于在Heap上分配了5个整数值的内存,因此它们被初始化为其默认值。
而且,当您声明数组引用时,不要使用任何数组对象初始化它: –
int[] in;
数组引用是在Stack上创建的(因为它是一个局部变量),但它默认情况下不会初始化为数组,也不会像实例变量那样为null
。
因此,当您使用第一种数组声明和初始化方式时,这就是分配的样子: –
"Your array reference" "on stack" | | "Array object on Heap" +----+ | in |----------> ([0, 0, 0, 0, 0]) +----+ "Stack" "Heap"
如果你这样做是同样的事情:
int[] in = new int[5]
作为实例变量或局部变量。 在两种情况下,数组对象in
将包含零。
区别在于你是否愿意做以下事情:
-
实例变量:
int[] in
; (它用null初始化),in
对象将存在于堆空间中 。 -
局部变量:
int[] in
; (它必须由用户初始化)将存在于堆栈中
对于基本类型数组,它被初始化为默认值。 在文档中它说:
创建具有指定长度的一维数组,并将数组的每个组件初始化为其默认值
对于整数类型,默认值为0。
是的,初始化数组时,内容将设置为该类型的默认值,对于int
,它将为0,对于引用类型,它将为null
。
如果您初始化一个数组并检查内容,您可以自己看到:
... final int[] in = new int[5]; for (int i = 0; i < in.length; i++) { System.out.println(in[i]); } ...
这将打印:
0 0 0 0 0
是
public void method() { int[] in = new int[5]; System.out.pritnln(in[0]); //output in 0 }
在这种情况下,您的Array是一个局部变量 ,您只需要初始化您的数组 。 一旦你初始化你的数组, 瞧你的数组元素** s得到他们的**默认值 。
在实例变量或局部变量中声明的数组是否会初始化为默认值并不重要。
每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化。
按照JLS
An array initializer creates an array and provides initial values for all its components.
将数组实例化为局部变量时,数组不包含5个零。