2026世界杯_2004年世界杯 - 1606811.com

首页 > 王者荣耀世界杯 > 对象实体为什么存放在堆

对象实体为什么存放在堆

前情提要,在 JVM 中,对象实体存储在 堆,对象引用是存储在 栈。为什么这样存放呢?这背后的缘由是什么?接下来我将通过 存放 和 使用 两个角度来讲述这个问题。废话少说,立刻发车。

什么是堆栈

针对这个问题,我们首先要了解,堆、栈的数据结构。

堆的数据结构是一个特殊线性表,存取数据的原则是先进后出,最先放入的总是最后拿出来。就像我们将书本存放到箱子,最先放入的书本总是被压在最底下,最后放入的书本总是在最顶层。

栈的数据结构通常是一个完全二叉树,每一个节点存储一个值,整棵树都是经过排序的。

在此,我们着重于堆和栈的 空间分配 的。

栈的内存空间相当于一栋均匀分层的大楼,每一层都是固定的面积,想要继续扩建,只能向上建筑楼层。因此,栈的每一块内存空间都是固定大小,存储内容的能力很受局限。

堆的内存空间相当于一棵树的每片叶子,叶子的大小各异,根据环境因素各自生长。因此,堆的每一块内存空间是动态增长的,可以灵活存储不同大小的对象实体。

为什么要区分堆栈

前面说过,栈的存储能力有局限性,而堆的存储能力可以动态、灵活地增长。根据这些特性,堆比栈有更足够的空间存放对象实体;另一方面,栈存放对象引用,不仅节省空间,还可以更加灵活的使用对象实体。

如果从业务的角度理解,堆的作用是存放业务数据,栈的作用是使用业务数据实现具体的业务逻辑,不同的业务场景,使用不同的业务数据实现对应的业务逻辑。

这样设计的使对象实体的 运用 更加的灵活、隔离、模块化。

灵活:相当于业务数据存放到一个空间足够的池子,我想实现怎样的逻辑,需要怎么的业务数据,通过引用的方式直接获取想要的业务数据。

隔离:业务数据和业务逻辑存放在不同的空间,互不干扰。

模块化:通过业务数据和业务逻辑的组合,形成具有特定功能的模块。

例子叙说

以图书馆作为例子,图书馆就是系统 全部 的内存空间,里面的任何东西都是基于图书馆来分配空间。

每一本书就是一个 对象实体,他们存放在书架上,书架就是 堆。假设图书馆有各种各样的书架,可以满足所有大小的书本,即使书的大小各异,管理员只需要找到合适的位置存放。

为了方便存取书本,图书馆管理员会为每一本书设计一个编号,并记录在一个表格上,编号就是对象实体的 内存地址。

那什么是 对象引用 呢,答案就是读者的每一条借书记录,每一次的借书行为可以理解为对书本的一次引用。借书的记录都会登记在一个表格上,这个表格就是 栈。借书记录仅仅是一段文字,所需要的空间很小,而且大小基本固定,通常情况下用一个本子、一个电子表格、一个数据库,做一个表格就可以满足需求。

书本、编号、借书记录三者的结合,相辅相成,让整个图书馆的对图书的管理更加的灵活、方便和规范。

多说一句

最后,总结一下,JVM 管理对象的模式,跟图书馆管理图书的模式十分相似。其实,代码世界中很多的设计原理都是源于我们的生活,又高于生活。设计模式就在我们身边,无处不在,善于观察生活中的事物,从生活中领悟设计模式吧。




「九」字笔顺详解,动画演示,字帖下载
酷狗的听歌识曲在哪里