数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的。
实际的数组对象被存储在堆(heap)内存中;如果该数组对象的数组引用变量是一个局部变量,则存储在栈(stack)内存中。
堆和栈的区别:
当一个方法执行时,每个方法都会建立自身的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存中,随着方法的执行结束,该方法的内存栈将自然销毁。因此,所以在方法中定义的局部变量都存放在栈内存中;当在程序中创建一个对象时,该对象将被保存在运行时数据区中,以便反复利用(因为对象的创建成本通常较大),该运行时数据区就是堆内存。堆内存中对象不会随着方法的结束而销毁,即使方法结束后,对象仍会被其他变量所引用。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适时间回收它。
为了能够有效销毁已经不会再使用的堆内存中的数组,可将数据的变量赋为null,即切断了数组引用变量和实际数组之间的引用关系,实际的的数组成为了垃圾。
当程序中初始化数据后,系统中实际上产生两个内存区,分别为栈内存中的引用变量,堆内存中的数据本身。如下图所示: