网站首页 > java教程 正文
提莫Teemo。
哈喽大家好,我是提莫。从这一节开始就正式进入数据结构的章节了,本节的内容也比较简单。这一节先来看一下数组、链表、队列和栈这4种结构。在之前的课程中是不是已经说过了数组?这里再来简单的回顾一下数组。
假如这里是我的一块内存,在内存中我声明了一个数组,在这里数组长度是不是为5,一共五个方块。数组有什么特征?它的长度是不是固定的,并且在内存中的位置是连续的。可以看到这五个方块是不是挨着排列的。
它有什么特点?在这里对数组的元素进行查找的时候是不是很快?这里可以根据它的下标01234来找,例如现在要找到下标为4的位置的元素,是不是可以快速定位到这个元素?
但是大家想一下数组这种结构有些什么缺点?例如现在要添加一个元素,之前提到过数组的长度是不是不可变的?所以如果要添加一个元素,它会在内存中再去开辟一块空间出来,长度就是所需要的长度。把原来数组里面的元素给复制过去,在新的位置添加上元素,这是一种场景。
还有种场景是什么?想在数组的中间去添加一个元素,是不是也要开辟一个新的数组空间,把原来的位置的元素复制过去,并且在这里插入元素之后要把后面的元素也复制过去。所以数组里面在数组中间进行插入或者是删除元素,消耗的时间成本是很高的。
说完了数组之后再来看一下第二种数据结构,是链表。跟数组不同的是链表在内存中并不是连续存储的,它可以东一块西一块。这样怎么去找到所有的元素?它可以在每一个节点指向下一个节点,这样即使每一个元素都在内存中的不同位置,但是是不是可以寻着这个线路,然后把你们一一的给找到。
但是大家想一下这种结构有哪些缺点,是不是不能够像数组一样通过索引快速找到某一个元素。例如我现在想找到这一个元素,是不是必须去找到这一个元素,然后通过它来进行向后面的依次寻找才能够找到它。
所以对链表而言查询操作是比较慢的,但是这样也有好处,也就是说在对它的中间元素进行修改的时候需要去复制一个新的链表,然后把它转移过去吗?并不需要,只需要在这里找到一块空间,然后把这一个位置的引用指向它,然后再去指向这一个元素就可以了,只需要改动一个引用就可以,这样是不是非常方便?
所以在链表里面查询比较慢,但是修改删除是很快的,并且链表的大小是不是可以动态的变化,因为它并不是连续的空间,所以当新增元素的时候只需要再去额外的开辟一块空间出来就可以了。
讲完了链表,接下来再来讲一下队列。队列其实是一种很简单的结构,就好像排队一样,当排队的时候是不是排在前面的人最先出去,越是后面排的人就越后出去,所以有一个先进先出的原则。
对于队列而言主要有两个操作,第一个就是入队,从外面进入队列,还有一个操作就是出队,也就是从队列里面出来。给大家演示一下这种入队出队的操作,是不是从这边进去,然后从这边出来。队列既可以使用数组来做它的底层实现,也可以使用链表来做底层实现。
除了队列以外还有一种结构是不是栈?这个栈是一种什么样的结构?其实它就相当于纸盒子,假如这里是一个纸箱,想一下通常在放东西的时候是不是先放进去的东西会被压在最下面,而后放进去的东西是不是在上面?这样在取这个东西的时候是不是从最上面开始取?也就是栈是遵循后进先出的原则。主要有两个操作,一个操作是把元素放进栈里面,这个操作叫压栈。还有一个是从栈里把元素拿出来,这个叫做弹栈。
接下来我来演示一下怎么进行压栈和弹栈。首先把b元素给压栈进去,是不是放入了栈里面?而后面的a元素在压栈的时候会在栈顶,弹栈的时候是不是a元素最先被取出来,接着再使b元素被取出来,这就是后进先出原则。同理栈的底层也可以使用数组或者是链表来实现,这个都是可以的。
这节主要是理解数组、链表、队列跟栈的几个特点,以及数组和链表各有什么优缺点。这一节关于数组、链表、队列和栈就先讲到这里,下一节再见。
猜你喜欢
- 2024-11-18 常见的消息队列对比
- 2024-11-18 java中的延迟队列——Redis
- 2024-11-18 Java重试队列-让服务更健壮
- 2024-11-18 SpringBoot消息队列
- 2024-11-18 临近期末考试,一篇消息队列和RocketMQ的总结送给你们(二)
- 2024-11-18 一文了解字节跳动消息队列演进之路
- 2024-11-18 消息队列中,如何保证消息的顺序性?
- 2024-11-18 Java开发中常用的消息队列工具 ActiveMQ
- 2024-11-18 临近期末考试,一篇消息队列和RocketMQ的总结送给你们(一)
- 2024-11-18 消息队列挂了,Java环境下如何妥善处理事务消息
你 发表评论:
欢迎- 最近发表
-
- 搞趣网:我的世界全新皮肤包原始居民下载地址
- 我的世界拔刀剑MOD下载(我的世界拔刀剑mod下载国际版)
- 我的世界无正版账号的简单联机方法(非网易版,仅适用于局域网)
- 一些可以显著提高大型 Java 项目启动速度的尝试
- 常见的java敏感异常介绍(java 常见的异常)
- Java 开发者必看!三招实现外部 Jar 包动态加载(含热更新方案)
- Java JAR 启动内存参数配置指南:从基础设置到性能优化
- 对Spring MVC接口进行Mock测试(springmvc对外接口)
- 还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS
- 干掉OpenFeign,SpringBoot 3.0 自带的 HTTP 客户端真香!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)