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

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

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

前言

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

内存中的数组

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

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

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

这里写图片描述

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

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

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

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

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

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

扫描二维码关注公众号,回复: 3181573 查看本文章

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

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

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

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

结尾

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

猜你喜欢

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