1、数组的内存空间是何时分配的
java中的数组是用来存储同一种数据类型的数据结构,一旦初始化完成,即所占的空间就已固定下来,初始化的过程就是分配对应内存空间的过程。即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。
了解什么是数组看这里:java中的数组是什么
当仅定义一个数组变量(int[] numbers)时,该变量还未指向任何有效的内存,因此不能指定数组的长度,只有对数组进行初始化(为数组元素分配内存空间)后才可以使用。
数组初始化分为静态初始化(在定义时就指定数组元素的值,此时不能指定数组长度)和动态初始化(只指定数组长度,由系统分配初始值)。
//静态初始化
int[] numbers = new int[] { 3, 5, 12, 8, 7 };
String[] names = { "Miracle", "Miracle He" };//使用静态初始化的简化形式
//动态初始化
int[] numbers = new int[5];
String[] names = new String[2];
建议不要混用静态初始化和动态初始化,即不要既指定数组的长度的同时又指定每个元素的值。
当初始化完毕后,就可以按索引位置(0~array.length-1)来访问数组元素了。
当使用动态初始化时,如在对应的索引位未指定值的话,系统将指定相应数据类型对应的默认值(整数为0,浮点数为0.0,字符为’\u0000’,布尔类型为false,引用类型(包括String)为null)。
public class TestArray {
public static void main(String[] args) {
String[] names = new String[3];
names[0] = "Miracle";
names[1] = "Miracle He";
/*
for(int i = 0; i < names.length;i++) {
System.out.print(names[i] + " ");
}
*/
//还可以使用foreach来遍历
for(String name : names) {
System.out.print(name + " ");
}
}
}
结果如下:
Miracle Miracle He null
Miracle Miracle He null
2、数组在内存中如何储存
首先给出数组(数组引用和数组元素)在内存中的存放形式,如图:
数组引用变量是存放在栈内存(stack)中,数组元素本质是一个对象,是存放在堆内存(heap)中。通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问。
了解堆和栈看这里:[java堆和栈有什么区别][3]
[3]:
当数组在初始化时,就会在堆中分配对应的空间,这个大小是不会因为内部元素的变化而变化,也就是说,如果数组中某个元素被清空,数组占用的内存空间也不会缩小。
存放引用类型数组在内存中如何储存看这里:[引用类型数组在内存中如何储存][4]
[4]: