一、解释定义

1. 数据结构

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。再简单描述一下:数据结构就是描述对象间逻辑关系的学科。

如果还是不太清楚下面会举例说明的。

2. 数据存储结构

简单的讲就是数据在计算机中的存储方式。

常用的数据存储方式有两种:顺序存储,非顺序存储。顺序存储就是把数据存储在一块联系的存储介质(硬盘或内存等)中。反之就是非顺序存储咯。Java中的数组就是典型的顺序存储,链表就是非顺序存储。数组存储数据时会开辟出一块联系内存,按顺序存储。链表先不会开辟出一块内存来,而是只需要知道下一个节点存储的位置,就能把所以的数据连起来了。所以单向链表的最后一个节点是指向Null的。

数组、链表、栈和队列是最基本的数据结构,任何程序语言都会涉及到其中的一种或多种。

二、数组

数组是数据结构中很基本的结构,很多编程语言都内置数组。

在java中当创建数组时会在内存中划分出一块连续的内存,然后当有数据进入的时候会将数据按顺序的存储在这块连续的内存中。当需要读取数组中的数据时,需要提供数组中的索引,然后数组根据索引将内存中的数据取出来,返回给读取程序。在Java中并不是所有的数据都能存储到数组中,只有相同类型的数据才可以一起存储到数组中。

所有的数据结构都支持几个基本操作:读取、插入、删除。

因为数组在存储数据时是按顺序存储的,存储数据的内存也是连续的,所以他的特点就是寻址读取数据比较容易,插入和删除比较困难。简单解释一下为什么,在读取数据时,只需要告诉数组要从哪个位置(索引)取数据就可以了,数组会直接把你想要的位置的数据取出来给你。插入和删除比较困难是因为这些存储数据的内存是连续的,要插入和删除就需要变更整个数组中的数据的位置。举个例子:一个数组中编号0->1->2->3->4这五个内存地址中都存了数组的数据,但现在你需要往4中插入一个数据,那就代表着从4开始,后面的所有内存中的数据都要往后移一个位置。这可是很耗时的。

三、链表

在java中创建链表的过程和创建数组的过程不同,不会先划出一块连续的内存。因为链表中的数据并不是连续的,链表在存储数据的内存中有两块区域,一块区域用来存储数据,一块区域用来记录下一个数据保存在哪里(指向下一个数据的指针)。当有数据进入链表时候,会根据指针找到下一个存储数据的位置,然后把数据保存起来,然后再指向下一个存储数据的位置。这样链表就把一些碎片空间利用起来了,虽然链表是线性表,但是并不会按线性的顺序存储数据。

由于链表是以这种方式保存数据,所以链表在插入和删除时比较容易,读取数据时比较麻烦。举个例子:一个链表中0->1->2->3->4这五个内存地址中都存了数据,现在需要往2中插入一条数据,那么只需要更改1号和2号中记录下一个数据的位置就行了,对其他数据没有影响。删除一条数据与插入类似,很高效。但是如果是想要在链表其中取出一条数据,就需要从0号开始一个一个的找,直到找到想要的那条数据为止。

链表中插入

链表中删除

四、栈

栈是一种先进后出的数据结构,数组和链表都可以生成栈。当数据进入到栈时会按照规则压入到栈的底部,再次进入的数据会压在第一次的数据上面,以此类推。

在取出栈中的数据的时候会先取出最上面的数据,所以是先进后出。

由于数组和链表都可以组成栈,所以操作特点就需要看栈是由数组还是链表生成的了,然后就会继承相应的操作特点。

五、队列

队列是一种先进先出的数据结构,数组和链表也都可以生成队列。当数据进入到队列中时也是先进入的在下面后进入的再上面,但是出队列的时候是先从下面出,然后才是上面的数据出,最晚进入的队列的,最后出。

举个简单的例子:可以把栈和队列看成是两根管子,这两根管子是用来存储数据的,有可能是数组生成的也有可能是链表生成的,栈的这根管子有一头是封死的,所以像这个管子放数据只能从一个口进,拿出数据的时候也只能从这一个口拿出来。而队列这根管子呢两个口都是敞开的,一个口负责进数据,另一个口负责出数据,所以从一进口先进去的数据,在出口处会先被拿出来。

推荐阅读

绝对干货,掌握这27个知识点,轻松拿下80%的技术面试(Java岗)

一线大厂为什么面试必问分布式?

在一次又一次的失败中,我总结了这份万字的《MySQL性能调优笔记》

并发编程详解:十三个工具类,十大设计模式,从理论基础到案例实战

如何高效部署分布式消息队列?这份《RabbitMQ实战》绝对可以帮到你

保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解相关推荐

  1. 面试官让我讲下线程的WAITING状态,我笑了

    转载自  面试官让我讲下线程的WAITING状态,我笑了 面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑... 一个正在无限期等待另一 ...

  2. 面试官让我讲下线程的TIMED_WAITING状态,我又笑了

    转载自  面试官让我讲下线程的TIMED_WAITING状态,我又笑了 面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑,可以撮这里 - ...

  3. 面试官系统精讲Java源码及大厂真题 - 23 队列在源码方面的面试题

    23 队列在源码方面的面试题 人要有毅力,否则将一事无成. 引导语 队列在源码方面的面试题,一般面试官会从锁,线程池等知识点作为问题入口,慢慢的问到队列,由于锁.线程池咱们还没有学习到,所以本章就直奔 ...

  4. 对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串?

    对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串? 比如["ABC", "ACB", &quo ...

  5. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  6. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 链表 + 栈 + 队列 部分!

    链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力.链表的操作也离不开指针,指针又很容易导致出错. 综合多方面的原因,链 ...

  7. 引用计数器法 可达性分析算法_面试官:你说你熟悉jvm?那你讲一下并发的可达性分析...

    持续输出原创文章,点击蓝字关注我吧 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这 ...

  8. 太逗了,面试官让我讲线程 WAITING 状态!

    面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态? 小菜J 会心一笑... 一个正在无限期等待另一个线程执行一个特别的动作的线程处于WAITING状态. & ...

  9. 面试官系统精讲Java源码及大厂真题 - 05 ArrayList 源码解析和设计思路

    05 ArrayList 源码解析和设计思路 耐心和恒心总会得到报酬的. --爱因斯坦 引导语 ArrayList 我们几乎每天都会使用到,但真正面试的时候,发现还是有不少人对源码细节说不清楚,给面试 ...

最新文章

  1. How can I pretty-print JSON in python?
  2. c++派生类的访问控制
  3. 树-二叉树、满二叉树和完全二叉树
  4. 特殊符号的写法 (HTML 4.01 符号实体)
  5. Jquery全选单选功能
  6. golang 两个一样的字符串不相等_分享一个姑娘双眼皮术后两个眼睛有点不一样,不知道该不该修复?...
  7. 分享自TERRY-V 《Qt Creator生成带图标的exe文件》
  8. JavaScript—获取参数(23)
  9. tbpbebzbyb英文_化工常用英文缩写
  10. 液晶12864图像取模方法
  11. 【20CSPS提高组】儒略日
  12. kaggle quora_我想以自己的方式使用网络,非常感谢Quora。
  13. 微软中国CEO梁念坚 : Windows Phone有四大优点
  14. 请帮我写一个末日丧尸生存文
  15. 读书分享-《心智突围》上
  16. pythoncad官网_Pycad: Python Extension for AutoCad
  17. spring cloudAlibaba gateway网关报错,显示无法找到注册中心注册自己。
  18. LEFT()与RIGHT()函数
  19. vs2019创建dll以及使用
  20. C语言大学期末考试重点,快点码住,再也不用担心挂科啦

热门文章

  1. Udacity机器人软件工程师课程笔记(二十三) - 控制(其一)- PID控制及其python实现
  2. 十大排序算法 导图总结
  3. CORS漏洞利用检测和利用方式
  4. 机器学习与数据科学 基于R的统计学习方法(基础部分)
  5. 接口测试(postman jmeter)
  6. Spring注解之 @EnableScheduling计划任务注解
  7. phonegap调用摄像头
  8. 巧用组策略关闭危险端口
  9. Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)
  10. 使用who.is查域名DNS信息以及用sameip.org查其他网站