数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的。实际的数组对象被存储在堆(heap)内存中,如果引用该数组对象的数组引用变量是一个局部变量,那么它被存储在栈中。数组在内存中的存储示意图:
通过一个例子来说明一下:
有这样一段代码,首先定义了两个数组a和b,分别初始化两个数组,输出数组的长度和元素,然后将a数组赋值给b数组,再输出数组b的长度。
执行结果如下:
从结果中可以看出,在初始化b数组时没有给数组b赋值,系统默认赋值为0.另外,可以看到当a数组赋值给b之后,b的长度为5,看起来似乎数组的长度发生了变化,其实这只是一个假象。
要知道:定义并初始化一个数组后,在内存中分离了两个空间,一个用户存放数组本身,另一个用于存放数组引用变量,结合例子可以知道,系统在内存中一共产生了4个内存区,其中栈内存中有两个引用变量,分别为a和b,堆内存中也有两个内存区,分别用于指向a引用和b引用所指向的数组本身。如图所示:
当执行b=a这条语句之后,系统将会把a的值赋给b,由于a和b都是引用变量,存储的都是地址,因此把a赋值给b之后,就是让b指向a所指向的地址。此时内存中的存储结构如下:
从上面的这个示意图可以看出,a和b都引用了第一个数组,此时第二个数组失去了引用,变成了垃圾,只有等待垃圾回收机制来回收,但是它的长度依然不变,直到它彻底消失。