JAVA 深入数组之 内存中的数组

版权声明:本文为博主原创文章,未经博主允许可以转载,但请保留原文链接。 https://blog.csdn.net/tmdlife/article/details/51747500

本页面更新日期: 2016年06月23日

前言

数组是一种引用数据类型.
数组引用变量只是一个引用.
数组元素和数组变量在内存里是分开存放的.
下面将深入介绍数组在内存中的运行机制.

内存中的数组

数组引用变量只是一个引用.
这个引用变量可以指向任何有效的内存.
只有当该引用指向有效内存后, 才可以通过该数组变量来访问数组元素.

与所有引用变量相同的是, 引用变量是 访问真实对象 的根本方式.
也就是说, 如果希望在程序中访问数组对象本身, 则只能通过这个数组的引用变量来访问它.

实际的数组对象被存放在堆(heap)内存中.
如果引用该数组对象的 数组引用变量 是一个局部变量, 那么它被存储在栈(stack)内存中.
下面我们看个示意图:

这里写图片描述

首先, 我们想知道 什么是栈内存, 什么是堆内存. 点我查看
通过上面的解答, 我们大概可以总结为:

  • 栈内存用于存放 地址
  • 堆内存用于存放 具体的数据

如果映射到现实中的话, 栈内存就是记录你家地址信息的. 堆内存就是你家.
快递员想要把东西送到你家. 知道你家地址后, 就可以找到你家. 嗯. 大概就是这么个意思. 不过肯定更复杂. 不过当下来讲, 先简单了解下就行了.

那么我们还可以再深入一点.
为什么有 栈内存 和 堆内存 之分呢??

当一个方法执行时, 会建立 属于自己的内存栈.
在这个方法内定义的变量将会逐个放入这块栈内存里..
当方法结束时, 属于这个方法的 栈内存 也将会被系统销毁.

在程序创建一个对象时, 这个对象将被保存到 堆内存 中. 为了方便反复利用.
堆内存中的对象不会因方法的结束而被系统销毁.
因为这个对象还可以被其它引用变量引用 (在方法的参数传递时很常见).
只有当这个对象没有被任何引用变量引用时, 系统才会把这个对象销毁.

映射到现实中, 我们可以这么看待这一过程.
你家门前的路 其名字 等等都是可以变的. 就算路销毁了, 你的房子并不会被销毁. 路就是栈内存, 你的房子就是堆内存.
除非你家门前再也不会修路, 同时你也不继续住这个房子了, 那么这个房子就变得没有了意义. 被销毁也就自然了.

举得例子可能不太恰当, 但是希望你能明白这其中意义的不同.
即使你现在不太能够理解, 也没关系.

如果堆内存中的数组 不再有任何引用变量 指向自己.
则这个数组将成为垃圾, 该数组所占的内存将会被系统回收.

友情提示: 程序员进行程序开发时, 不要仅仅停留在代码表面, 而要深入底层的运行机制, 才可以对程序的运行机制有更准确的把握.
看待一个数组时, 一定要把数组看成两个部分:
一部分是数组引用, 也就是在代码中定义的数组引用变量.
另一部分是实际的数组对象, 这部分是在 堆内存里运行的. 通常无法直接访问它.
只能通过数组引用变量来访问.

结尾

如果你想学习更多JAVA知识, 可以 点我进入目录页

猜你喜欢

转载自blog.csdn.net/tmdlife/article/details/51747500