Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

细节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的垃圾回收器进行回收以释放内存。