细节6 管理内存——内存中的数组
在Java中通过数组可以操作内存,创建数组时需要为数组分配内存空间,操作数组时,就是对内存空间中的数组元素进行操作,数组创建后,数组的引用与数组元素分别存储在栈内存和堆内存中,并通过数组的引用与数组元素的下标值对数组元素进行操作。
示例:
int[] value = { 10 ,20 ,30 ,40 ,50 ,60 };
上面的代码创建了一个数组,数组的引用是value,数组有6个元素,分别是10、20、30、40、50和60,该数组在内存中的分布如图5.8所示。
图5.8 数组value在内存中的分布图
说明
从图5.8中可以看出,数组的引用value是存储在栈内存中的,而数组的元素则存储在堆内存中,并且只能使用数组的引用和下标来操作数组的元素,当数组的引用被赋值为null时,数组的元素将被JVM的垃圾回收器回收,从而释放数组所占用的内存空间。
当数组元素失去数组的引用,数组元素将变成没用的数组,也就是将变成垃圾等待JVM的垃圾回收器进行回收。
示例:
❶int[] x = { 10 ,20 ,30 ,40 }; ❷int[] y = { 100 ,200 ,300 ,400 ,500 ,600 }; System. out. println ("数组x的长度是:" + x. length); // 输出数组x的长度 System. out. println ("数组y的长度是:" + y. length); // 输出数组y的长度 ❸y = x; // 将数组x的引用赋给数组y的引用 System. out. println ("数组y的长度是:" + y. length); // 输出数组y的长度
上面的示例首先输出“数组x的长度是:4”这样的信息,接着又输出“数组y的长度是:6”这样的信息,最后输出“数组y的长度是:4”这样的信息。
说明
程序在标记❶和标记❷处创建了两个数组x和y,此时,这两个数组的内存分布如图5.9所示。
图5.9 数组x和y在内存中的分布
从图5.9可以看出,数组x有4个元素,分别是10、20、30和40;数据y有6个元素,分别为100、200、300、400、500和600,所以程序首先输出“数组x的长度是:4”这样的信息,接着又输出“数组y的长度是:6”这样的信息。
说明
当程序执行到标记❸处时,将数组x的引用赋值给数组y的引用,此时数组x的引用与数组y的引用都指向数组x的元素,并且数组y的元素失去了数组y的引用,此时数组y的元素变成了垃圾,如图5.10所示。
图5.10 引用赋值后的效果
从图5.10中可以看出,由于数组y的引用不再指向数组y的元素,而是指向数组x的元素,因此数组y的引用此时有4个元素,所以程序最后输出了“数组y的长度是:4”这样的信息,由于数组y的元素已经失去数组y的引用,所以变成了垃圾,并由JVM的垃圾回收器进行回收以释放内存。