声明数组是在栈里//int[] array=null;
创建数组是在堆里//arry=new int[10];
在Java中,数组是一种引用类型。创建一个数组时,需要分配内存来存储数组元素。
假设我们要创建一个包含3个整数的数组:
int[] array = new int[3];
上述代码将在内存中创建一个名为 array
的变量来引用数组对象。数组对象本身是在堆(Heap)上分配的。
内存示意图如下所示:
+-----+
array --> | |
+-----+
此时,数组还没有被初始化,每个元素的值都为默认值(0)。在堆上将为数组分配连续的内存空间,可以通过下标访问数组元素。
接下来,我们为数组的每个元素赋值:
java复制代码array[0] = 10;
array[1] = 20;
array[2] = 30;
内存示意图更新如下:
+-----+
array --> | * |
+-----+
|10 |
+-----+
|20 |
+-----+
|30 |
+-----+
现在,数组的每个元素都有了具体的值。
请注意,数组的索引从0开始,因此 array[0]
表示第一个元素, array[1]
表示第二个元素,以此类推。
当我们使用数组时,可以通过数组名和索引访问特定的元素。例如,array[1]
的值为20。
需要注意的是,数组的内存分配是连续的,这意味着所有元素都存储在相邻的内存位置上。这也使得通过索引访问元素的操作效率较高。
在Java中,声明一个数组变量时,变量本身(即引用)存储在栈内存中。例如,int[] array = null;
中的 array
变量存储在栈内存中。此时,array
变量还没有指向任何有效的数组对象,因此它被初始化为 null
。
接下来,当我们使用 new
关键字创建一个具体大小的数组时,数组对象将在堆内存中动态分配。
例如,array = new int[10];
将在堆内存中分配一个包含10个整数的数组对象,并将 array
变量指向该数组对象。
内存示意图如下所示:
+-----+
array --> | |
+-----+
...
+------+
array --> | * |
+------+
|0 |
+------+
|0 |
+------+
...
+------+
|0 |
+------+
现在,array
变量指向新创建的数组对象,数组的每个元素都被初始化为默认值(在这种情况下为0)。
需要注意的是,在 Java 中,基本类型数组(如 int[]
)和对象数组(如 String[]
)的工作原理是相同的。它们都在堆内存中进行动态分配。
数组的四个基本特点
数组的长度是确定的,数组一旦被创建,它的大小就是不可以改变的。
其元素必须是相同类型,不允许出现混合类型。
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
-
数组的长度是确定的,并且一旦创建后,其长度是不可改变的。在创建数组时需要指定其长度,然后无法动态调整数组的大小。
-
数组中的元素必须是相同的类型,不允许出现混合类型。例如,创建一个整数数组,其中的每个元素都必须是整数类型。
-
数组中的元素可以是任何数据类型,可以是基本类型(如整数、浮点数等)或引用类型(如对象、字符串等)。
-
数组变量是引用类型,它指向堆内存中的数组对象。因此,数组本身是在堆内存中创建和存储的。