从头开始学习->java数据结构(一):物理上的存储结构
前言
我们都知道,所谓的数据结构,都是我们在为了更好的对数据的增删改查而创造出来的对数据的结构设计,但是我们要知道的是,这些数据结构都是抽象的逻辑结构,并不是真实的物理上的存储结构,大部分时候,我们对数据结构的讨论,也都是讨论的是逻辑上的数据结构,并不是对真实的存储在硬盘中的数据的存储结构的讨论。
真实的物理上的数据,存储到我们的硬盘上的或者是在内存上的时候,都是有着确切的存储结构的,而不是我们想象中的类似b树,二叉树这种抽象的逻辑结构。
那么,在我们的硬盘上,数据是如何存储的呢?这个问题,是我们去研究逻辑上的数据结构之前,需要搞清楚的问题,也是我们本篇文章的主题。
正文
物理存储结构,是数据的逻辑结构在计算机中的存储形式。
但是在理解物理上的数据存储结构之前,我们要先对硬盘有一个足够的了解。
硬盘是一个实际存在的物品,那么也就是说,这个硬盘不可能如我们想象出的逻辑设计那样,去存储我们的数据。想象一下,如果存一百万条数据,我们在硬盘中随意存储,不按照客观的物理规则来存储,那么我们会发现,硬盘的空间会被很大的浪费掉。
也因此,在硬盘中存储数据的时候,我们必须按照一定的客观规律来。而这种客观规律,在计算机发展的过程中,逐渐形成了现在比较常见的两种规律。
1.顺序存储结构
顺序存储结构,是将我们逻辑上的数据结构中相邻的数据,在物理位置上,也存储在相邻的位置。数据结构中的节点关系由存储单元的邻接关系来体现。
也就是说,数据间的逻辑关系和物理关系是一致的。
一般来说,在我们java语言中,描述这种物理存储结构的话,都是借助我们的 数组 来阐述的。如图所示:
这种存储结构,还是很好理解的,说白了,就是排队而已,每一条数据都是占一小段空间,按照顺序站好,占据着连续的存储空间。
1.1 优点
顺序存储结构的优点还是比较明显的,由于是按照物理上的存储空间的顺序存储数据,那么对存储空间的利用率就会非常高,存储密度比较大。
而且因为是顺序存储数据,那么也就是说,我们的数据,存储在这里的时候,天然在硬盘中的平均寻道时间中,就会快很多。
那么,什么是寻道时间呢? 先看一张关于磁盘的图片,如下:
我们发现,这种传统的硬盘,数据是存储到磁盘中的磁道(磁盘盘片)中,通过磁头(读写磁头)来查找数据。而平均寻道时间就是指磁头移动到数据所在的磁道所使用的时间的平均值。
如果硬盘的寻道速度变快,那么就意味着我们的查找数据能力也在变快。
而在我们的顺序存储结构中,我们的数据是按照磁道的轮转顺序存储到磁道上的,也就是说,当我们进行数据查找的时候,会更快的定位到实际的数据所在,这也就是意味着我们的数据查找速度变快。
<table><tr><td> 小知识;
在现代的计算机进化过程中,数据的存储有了很大的变化,比如说我们现在比较常见的固态硬盘,由于SSD固态硬盘没有磁头,所以几乎不存在寻道时间这一概念,当系统发出指令时,不需要磁头和盘片,而是直接从Flash颗粒上读取,相对传统的机械硬盘的寻道时间来说要快多了。
</td></tr></table>
顺序存储结构的优点总结如下:
- 数据存储密度大,存储空间的利用率要大。
- 查找速度比较快。
1.2 缺点
首先我们知道的是,顺序存储结构,存储的数据,在存储空间中,是连续的,如下图所示;
那么当我们要插入一条数据的时候,会怎么样呢?如图所示:
从图所示的插入过程中,我们发现,自插入位置起,后面的所有数据元素都往后面移动了一位,想一想,如果数据量上去了,那么等于大量的数据都要移动,而且实际的情况,远远比这个更糟糕,所以这样的插入效率,可想而知。
而删除的过程,虽然和插入恰恰相反,但是造成的后果,都是一样的,都是会导致大量的数据移动位置。
也因此,我们知道的是,顺序存储结构的缺点,就是在插入或者是删除的时候,效率会比较低。
2. 链式存储结构
在实际的数据操作过程中,有的数据结构需要的是查找的时候速度快一点,那么我们的顺序存储结构是符合这种需求的,但是也有很多时候,我们的数据会被多次删除也会被多次的插入,这就引发了一个问题,顺序存储结构不能满足这种需求场景,于是就出现了链式存储结构。
链式存储结构是将数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
也就是说,在链式存储结构中,数据是可以放到这个存储空间的任意位置,也因此,数据与数据之间物理位置的关系,不能表达出数据之间的逻辑关系。
那么,要如何解决这种逻辑关系呢?
于是在链式存储结构中,会将一个数据单元,分为两个区域,一个数据域,一个指针域。
数据域存储的就是我们实际的数据,而指针域则存储的是关联的其他数据的位置的指针,如果要通过链式存储结构存储数据 [A , B , C , D , E] ,存储的大概模型如图所示:
在这张图的基础上,经过转变后,将图变为如下的样子: 这样可以看的出来,指针域指向了下一个数据节点,也就是说,在连式存储结构中,数据之间的关系,是通过指针域的指向关系来表现的,和数据实际存储的位置没有关系。
2.1 优点
链式存储结构的优点是很好理解的,先看链式存储结构的插入图:
由于链式存储结构中,数据的关系不是由数据的实际存储位置表示的,而是由各个数据节点的指针域来表示的,那么也就是说,在数据插入或者删除的时候,不需要将插入数据后面的数据移动,只需要修改一下指针域的指向性就可以了。
也就是说,链式存储结构的插入或者删除元素很方便,比较灵活。而且我们看到的是,链式存储结构不需要连续的内存来存储,也就是说,对碎片型的内存的利用效率还是相对比较高的。
2.2 缺点
在顺序存储结构中,数据的存储就只需要存储这个数据就行。但是在链式存储结构中,数据的存储,除了存储的是这个数据外,还需要存储和这个数据相关的指针域。
这样,就相比于顺序存储结构外,链式存储结构多存储了一部分其他的数据,所以对存储空间的利用率就会降低。
而且要注意的是,链式存储结构,在物理逻辑上讲,因为实际存储的位置不是顺序的,那么读取的时候,效率会比较低。
总结
3.1 顺序存储结构
优点:
- 数据存储密度大,存储空间的利用率要大。
- 查找速度比较快。 缺点:
- 插入或者是删除的时候,效率会比较低
3.2 链式存储结构
优点:
- 插入或者删除的时候,效率比较高
- 对碎片型的内存利用率高。 缺点:
- 额外新增了指针域的数据,对内存的消耗大
- 在读取的时候效率比较低。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
拥抱云原生,Fluid 结合 JindoFS:阿里云 OSS 加速利器
作者|王涛(扬礼)、车漾(必嘫) 来源|阿里巴巴云原生公众号 什么是Fluid Fluid是一个开源的 Kubernetes 原生的分布式数据集编排和加速引擎,主要服务于云原生场景下的数据密集型应用,例如大数据应用、AI 应用等。通过 Kubernetes 服务提供的数据层抽象,可以让数据像流体一样在诸如 HDFS、OSS、Ceph 等存储源和 Kubernetes 上层云原生应用计算之间灵活高效地移动、复制、驱逐、转换和管理。而具体数据操作对用户透明,用户不必再担心访问远端数据的效率、管理数据源的便捷性,以及如何帮助 Kuberntes 做出运维调度决策等问题。用户只需以最自然的 Kubernetes 原生数据卷方式直接访问抽象出来的数据,剩余任务和底层细节全部交给 Fluid 处理。 Fluid 项目当前主要关注数据集编排和应用编排这两个重要场景。数据集编排可以将指定数据集的数据缓存到指定特性的 Kubernetes 节点,而应用编排将指定该应用调度到可以或已经存储了指定数据集的节点上。这两者还可以组合形成协同编排场景,即协同考虑数据集和应用需求进行节点资源调度。 然后介绍 Flu...
- 下一篇
Serverless 躁动背后的 5 大落地之痛
来源|阿里巴巴云原生公众号 Serverless 从诞生起 就被赋予了变革云计算的使命 但是 往往看上去越厉害的东西 落地时遇到的困难就会越多 Serverless也不例外** 痛点一:厂家锁定 无论是个人用户,还是企业客户 大家都不希望自己被厂家锁定 而是任由自己选择服务和产品 但选择了 Serverless 的客户 会面临更高的迁移成本 因为 Serverless 不像容器技术 他没有 K8s 那样的行业标准和通用技术框架 厂家们实现Serverless的方式并不相同 痛点二:黑盒,客户没有控制权 Serverless 屏蔽了基础设施的运维 但也屏蔽了客户对基础设施的控制力 看不见,也摸不着 你是更相信自己,还是全部交付给厂商 这是一个选择题,也是一种信仰 痛点三:成本不易控制 Serverless 通过减少你的闲置资源来降低成本 但他的计费方式不一样 按请求收费 客户需要不断实践 才能找到性能和成本的最佳平衡点 痛点四:工作习惯变化太大,限制太多 Serverless 彻底改变了研发和运维的工作方式 微服务 是将巨型应用拆成一个个微服务 Serverless 则是将应用拆成一个个...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境