当前位置: 首页 > news >正文

Java数据结构-栈、队列常用类(Stack、ArrayDeque、LinkedLList)

数据结构的三要素包括:逻辑结构、存储结构、数据的运算。逻辑结构描述的是数据之间的逻辑关系,分为线性结构(线性表(数组、链表)、栈、队列)和非线性结构(图、树、集合)。物理结构也称为存储结构(顺序存储、链式存储、索引存储、散列存储)。

常见的数据结构分为线性数据结构和非线性数据结构,包括:数组、链表、栈、队列、树、图、散列表等。

 在Java中,数组这种数据结构有专门的实现:不可变数组(int [] array={})、可变数组(ArrayList),同样的链表这种数据结构也有专门的实现类(LinkedList),这些实现类都是java封装好的类,开箱即用。但是,java有没有专门针对于栈、队列这两种数据结构的封装类呢?

结果是肯定的。下面我们来介绍在java这门语言中,对栈、队列这两种数据结构的封装类。

一、栈(Stack、ArrayDeque、LinkedList)

首先来看一下JAVA集合体系图

 

Stack类,正如类名那样,该类是java对栈这种数据结构的封装,我们可以很容易滴使用该类中的方法实现栈的所有功能。下面是该类的五个方法

方法名返回类型说明
emptyboolean判断是否为空
peekE只返回栈顶端的元素,不弹出该元素(空栈会抛出异常)
popE弹出栈顶的元素
pushE将元素压入栈,并返回
searchint返回最靠近顶端的目标元素到顶端的距离(调用 lastIndexOf)

不过,由于Stack类是继承至Vector,Vector 类在方法上添加了 synchronized ,以达到线程安全的目的,不过 JVM 级别的 synchronized 特别消耗资源,已不被 Java 官方推荐使用。因此,用Stack类作为栈来使用已经不合时宜。

 ArrayDeque类实现了Deque接口,而Deque接口又继承至Queue接口,Queue是一个单向队列,在头部进行remove()、poll()出队操作,在尾部进行add()、offer()入队操作,使用peek()、element()方法检索队列头。下面的表格给出了Queue接口的方法,

boolean

add(E e) 

将指定的元素插入到此队列中,如果可以立即执行此操作,而不会违反容量限制, true在成功后返回 IllegalStateException如果当前没有可用空间,则抛出IllegalStateException。

E

element() 

检索,但不删除,这个队列的头。

boolean

offer(E e) 

如果在不违反容量限制的情况下立即执行,则将指定的元素插入到此队列中。

E

peek() 

检索但不删除此队列的头,如果此队列为空,则返回 null 。

E

poll() 

检索并删除此队列的头,如果此队列为空,则返回 null 。

E

remove() 

检索并删除此队列的头。

 Deque接口定义了双端队列,deque(double-ended queue,双端队列)是一种具有队列和栈的性质的数据结构,它允许两端都可以进行入和出队操作的队列,即元素可以从队头出队和入队,也可以从队尾出队和入队。因此。Deque即可当成队列使用,也可当成栈使用。下面是Deque中定义的方法:

boolean

add(E e) 

将指定的元素插入此双端队列表示的队列中(换句话说,在此双端队列的尾部),如果它是立即可行且不会违反容量限制,返回 true在成功时和抛出 IllegalStateException如果当前没有空间可用的。

void

addFirst(E e) 

插入此双端队列的前面,如果它是立即可行且不会违反容量限制,抛出一个指定的元素 IllegalStateException如果当前没有空间可用。

void

addLast(E e) 

在插入如果它是立即可行且不会违反容量限制,抛出此双端队列的末尾指定元素 IllegalStateException如果当前没有空间可用。

boolean

contains(Object o) 

如果此deque包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索但不删除由此deque表示的队列的头部(换句话说,该deque的第一个元素)。

E

getFirst() 

检索,但不删除,这个deque的第一个元素。

E

getLast() 

检索,但不删除,这个deque的最后一个元素。

Iterator<E>

iterator() 

以正确的顺序返回此deque中的元素的迭代器。

boolean

offer(E e) 

将指定的元素插入由此deque表示的队列(换句话说,在该deque的尾部),如果可以立即执行,而不违反容量限制, true在成功时 false如果当前没有可用空间,则返回false。

boolean

offerFirst(E e) 

在此deque的前面插入指定的元素,除非它会违反容量限制。

boolean

offerLast(E e) 

在此deque的末尾插入指定的元素,除非它会违反容量限制。

E

peek() 

检索但不删除由此deque表示的队列的头部(换句话说,此deque的第一个元素),如果此deque为空,则返回 null 。

E

peekFirst() 

检索,但不删除,此deque的第一个元素,或返回 null如果这个deque是空的。

E

peekLast() 

检索但不删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

poll() 

检索并删除由此deque(换句话说,此deque的第一个元素)表示的队列的 null如果此deque为空,则返回 null 。

E

pollFirst() 

检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

pollLast() 

检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

pop() 

从这个deque表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此deque表示的堆栈(换句话说,在此deque的头部),如果可以立即执行此操作而不违反容量限制,则抛出 IllegalStateException如果当前没有可用空间)。

E

remove() 

检索并删除由此deque表示的队列的头(换句话说,该deque的第一个元素)。

boolean

remove(Object o) 

从此deque中删除指定元素的第一个出现。

E

removeFirst() 

检索并删除此deque的第一个元素。

boolean

removeFirstOccurrence(Object o) 

从此deque中删除指定元素的第一个出现。

E

removeLast() 

检索并删除此deque的最后一个元素。

boolean

removeLastOccurrence(Object o) 

从此deque中删除指定元素的最后一次出现。

int

size() 

返回此deque中的元素数。

ArrayDeque类实现了Deque接口 ,类内方法基本与Deque一致。不过ArrayDeque类的底层是一个环形数组,具体来说在逻辑结构上是一个环形,但是实际存储结构上是一个一维数组。

在这里插入图片描述

下面是该类的常用方法 

boolean

add(E e) 

在此deque的末尾插入指定的元素。

void

addFirst(E e) 

在此deque前面插入指定的元素。

void

addLast(E e) 

在此deque的末尾插入指定的元素。

void

clear() 

从这个deque中删除所有的元素。

ArrayDeque<E>

clone() 

返回此deque的副本。

boolean

contains(Object o) 

如果此deque包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索,但不删除,由这个deque表示的队列的头。

E

getFirst() 

检索,但不删除,这个deque的第一个元素。

E

getLast() 

检索,但不删除,这个deque的最后一个元素。

boolean

isEmpty() 

如果此deque不包含元素,则返回 true 。

Iterator<E>

iterator() 

返回此deque中的元素的迭代器。

boolean

offer(E e) 

在此deque的末尾插入指定的元素。

boolean

offerFirst(E e) 

在此deque前面插入指定的元素。

boolean

offerLast(E e) 

在此deque的末尾插入指定的元素。

E

peek() 

检索但不删除由此deque表示的队列的头部,如果此deque为空,则返回 null 。

E

peekFirst() 

检索但不删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

peekLast() 

检索但不删除此deque的最后一个元素,或返回 null如果此deque为空)。

E

poll() 

检索并删除由此deque(换句话说,该deque的第一个元素)表示的队列的 null如果此deque为空,则返回 null 。

E

pollFirst() 

检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。

E

pollLast() 

检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。

E

pop() 

从这个deque表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此deque表示的堆栈上。

E

remove() 

检索并删除由此deque表示的队列的头部。

boolean

remove(Object o) 

从此deque中删除指定元素的单个实例。

E

removeFirst() 

检索并删除此deque的第一个元素。

boolean

removeFirstOccurrence(Object o) 

删除此deque中指定元素的第一个出现(从头到尾遍历deque时)。

E

removeLast() 

检索并删除此deque的最后一个元素。

boolean

removeLastOccurrence(Object o) 

删除此deque中指定元素的最后一次(从头到尾遍历deque时)。

int

size() 

返回此deque中的元素数。

Spliterator<E>

spliterator() 

创建一个late-binding失败快速 Spliterator在这个deque的元素。

Object[]

toArray() 

以适当的顺序返回一个包含此deque中所有元素的数组(从第一个到最后一个元素)。

<T> T[]

toArray(T[] a) 

以正确的顺序返回一个包含此deque中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。

 LinkedList的底层维护了一个双向链表,它同时实现了List接口和Deque对口,因此它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack),换句话说,它同时具备双向链表和双端队列特点。从继承图上来看,该类实现了Deque接口,因此可以使用接口中的方法。

boolean

add(E e) 

将指定的元素追加到此列表的末尾。

void

add(int index, E element) 

在此列表中的指定位置插入指定的元素。

boolean

addAll(Collection<? extends E> c) 

按照指定集合的迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾。

boolean

addAll(int index, Collection<? extends E> c) 

将指定集合中的所有元素插入到此列表中,从指定的位置开始。

void

addFirst(E e) 

在该列表开头插入指定的元素。

void

addLast(E e) 

将指定的元素追加到此列表的末尾。

void

clear() 

从列表中删除所有元素。

Object

clone() 

返回此 LinkedList的浅版本。

boolean

contains(Object o) 

如果此列表包含指定的元素,则返回 true 。

Iterator<E>

descendingIterator() 

以相反的顺序返回此deque中的元素的迭代器。

E

element() 

检索但不删除此列表的头(第一个元素)。

E

get(int index) 

返回此列表中指定位置的元素。

E

getFirst() 

返回此列表中的第一个元素。

E

getLast() 

返回此列表中的最后一个元素。

int

indexOf(Object o) 

返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。

int

lastIndexOf(Object o) 

返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。

ListIterator<E>

listIterator(int index) 

从列表中的指定位置开始,返回此列表中元素的列表迭代器(按适当的顺序)。

boolean

offer(E e) 

将指定的元素添加为此列表的尾部(最后一个元素)。

boolean

offerFirst(E e) 

在此列表的前面插入指定的元素。

boolean

offerLast(E e) 

在该列表的末尾插入指定的元素。

E

peek() 

检索但不删除此列表的头(第一个元素)。

E

peekFirst() 

检索但不删除此列表的第一个元素,如果此列表为空,则返回 null 。

E

peekLast() 

检索但不删除此列表的最后一个元素,如果此列表为空,则返回 null 。

E

poll() 

检索并删除此列表的头(第一个元素)。

E

pollFirst() 

检索并删除此列表的第一个元素,如果此列表为空,则返回 null 。

E

pollLast() 

检索并删除此列表的最后一个元素,如果此列表为空,则返回 null 。

E

pop() 

从此列表表示的堆栈中弹出一个元素。

void

push(E e) 

将元素推送到由此列表表示的堆栈上。

E

remove() 

检索并删除此列表的头(第一个元素)。

E

remove(int index) 

删除该列表中指定位置的元素。

boolean

remove(Object o) 

从列表中删除指定元素的第一个出现(如果存在)。

E

removeFirst() 

从此列表中删除并返回第一个元素。

boolean

removeFirstOccurrence(Object o) 

删除此列表中指定元素的第一个出现(从头到尾遍历列表时)。

E

removeLast() 

从此列表中删除并返回最后一个元素。

boolean

removeLastOccurrence(Object o) 

删除此列表中指定元素的最后一次出现(从头到尾遍历列表时)。

E

set(int index, E element) 

用指定的元素替换此列表中指定位置的元素。

int

size() 

返回此列表中的元素数。

Spliterator<E>

spliterator() 

在此列表中的元素上创建late-binding故障快速 Spliterator 。

Object[]

toArray() 

以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。

<T> T[]

toArray(T[] a) 

以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。

由于LinkedList与ArrayDeque都是实现了Deque接口,因此这两个类中定义的方法几乎完全相同,因此这两个类的用法也几乎没有什么差异,虽然对于使用者而言,用这两个类都可以轻而易举的实现栈、队列的功能。

相关文章:

Java数据结构-栈、队列常用类(Stack、ArrayDeque、LinkedLList)

数据结构的三要素包括&#xff1a;逻辑结构、存储结构、数据的运算。逻辑结构描述的是数据之间的逻辑关系&#xff0c;分为线性结构&#xff08;线性表&#xff08;数组、链表&#xff09;、栈、队列&#xff09;和非线性结构&#xff08;图、树、集合&#xff09;。物理结构也…...

拯救了大批爬虫程序员,因为一个简单的神器

相信大家应该都写过爬虫&#xff0c;简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫&#xff0c;就需要在程序里面加上请求头和参数信息。类似这种&#xff1a;我们一般的步骤是&#xff0c;先到浏览器的网络请求中找到我们需要的请求&#xff0c;然后将请求头和参数信息…...

2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解

更新时间:2023-2-19 16:30 相关链接 &#xff08;1&#xff09;2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 &#xff08;2&#xff09;2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 &#xff08;3&#xff09;2023年美赛C题Wordle预测问题三、四建模…...

相关性-回忆录(持续更新)

1.TODO方向 &#xff08;1&#xff09;数据增强&#xff1a;finetuning阶段需要大量人工标注样本&#xff0c;消耗时间和成本。用户点击数据作为弱监督学习&#xff0c;可以尝试图网络构建节点和边&#xff08;query聚合&#xff09;&#xff1b; 使用展现未点击生成对抗网络进…...

(必备技能)使用Python实现屏幕截图

(必备技能)使用Python实现屏幕截图 文章目录 (必备技能)使用Python实现屏幕截图 一、序言二、环境配置 1、下载pyautogui包2、下载opencv-python包3、下载PyQt5包4、下载pypiwin32包 三、屏幕截屏源码与解析 1、使用pyautogui方法实现截屏2、使用PyQt方法实现截屏 a.获取窗口…...

「数据仓库」怎么选择现代数据仓库?

构建自己的数据仓库时要考虑的基本因素我们用过很多数据仓库。当我们的客户问我们&#xff0c;对于他们成长中的公司来说&#xff0c;最好的数据仓库是什么时&#xff0c;我们会根据他们的具体需求来考虑答案。通常&#xff0c;他们需要几乎实时的数据&#xff0c;价格低廉&…...

6.3 使用 Swagger 生成 Web API 文档

第6章 构建 RESTful 服务 6.1 RESTful 简介 6.2 构建 RESTful 应用接口 6.3 使用 Swagger 生成 Web API 文档 6.4 实战&#xff1a;实现 Web API 版本控制 6.3 使用 Swagger 生成 Web API 文档 高质量的 API 文档在系统开发的过程中非常重要。本节介绍什么是 Swagger&#xff…...

Day894.加锁规则的一些问题 -MySQL实战

加锁规则的一些问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于加锁规则的一些问题的内容。 加锁规则&#xff0c;这个规则中&#xff0c;包含了两个“原则”、两个“优化”和一个“bug”&#xff1a; 原则 1&#xff1a;加锁的基本单位是 next-key lock。nex…...

【Flutter入门到进阶】Dart进阶篇---Dart异步编程

1 并行与并发的编程区别 1.1 并发与并行 1.1.1 说明 我们举个例子,如果有条高速公路 A 上面并排有 8 条车道,那么最大的并行车辆就是 8 辆此条高速公路 A 同时并排行走的车辆小于等于 8 辆的时候,车辆就可以并行运行。 CPU 也是这个原理,一个 CPU 相当于一个高速公路 A,核心数…...

点云配准方法原理(NDT、ICP)

配准是点云处理中的一个基础问题&#xff0c;众多学者此问题进行了广泛而深入的研究&#xff0c;也出现了一系列优秀成熟的算法&#xff0c;在三维建模、自动驾驶等领域发挥着重要的作用。 本文主要介绍粗配准NDT (Normal Distribution Transform) 与 精配准ICP (Iterative Cl…...

大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介

&#x1f4da;️Reference: IoT 边缘计算系列文章 什么是边缘容器&#xff1f; 边缘容器的概念 边缘容器是分散的计算资源&#xff0c;尽可能靠近最终用户或设备&#xff0c;以减少延迟、节省带宽并增强整体数字体验。 可以访问互联网的设备数量每天都在增加。有包括但不限于…...

代码随想录算法训练营第45天动态规划 背包基础 1 2、 416. 分割等和子集

文章目录01背包基础 &#xff08;二维数组&#xff09;思路递推公式初始化遍历顺序一维dp数组&#xff08;滚动数组&#xff09;一维数组的递推公式遍历顺序LeetCode 416. 分割等和子集思路总结01背包基础 &#xff08;二维数组&#xff09; 思路 根据动态规划五部进行分析&a…...

QT学习记录(六)类对象属性

类对象属性用来描述类对象的一些信息和当前的状态。类对象属性可以由类的编写者在编写类的时候定义&#xff0c;也可以由类的使用者在使用对象的时候定义。 由类的编写者定义 QPROPERTY()宏就是用来定义一个对象属性。 以第二行属性举例 QPROPERTY(bool enabled READ isEnabl…...

Spring Cloud Alibaba从搭建到源码完整进阶教程

微服务简介 Spring Cloud Alibaba 微服务简介 Nacos注册中心配置中心 Spring Cloud Nacos实战&#xff08;一&#xff09;- 下载和安装 Spring Cloud Nacos实战&#xff08;二&#xff09;- 服务提供者注册 Spring Cloud Nacos实战&#xff08;三&#xff09;- 服务消费者…...

Spring Cloud Nacos实战(一)- 下载和安装

Spring Cloud Alibaba Nacos下载和安装 Nacos介绍 ​ Nacos&#xff08;Naming Configuration Service&#xff09; 是一个易于使用的动态服务发现、配置和服务管理平台&#xff0c;用于构建云原生应用程序 ​ 服务发现是微服务架构中的关键组件之一。Nacos 致力于帮助您发现…...

深入理解设备像素比

文章目录参考描述像素分辨率显示分辨率图像分辨率物理分辨率分辨率单位&#xff08;仅部分&#xff09;DPIPPI设备像素比设备物理像素设备独立像素设备像素比产生放大与缩小尾声参考 项目描述关于物理像素、逻辑像素&#xff08;css像素&#xff09;、分辨率、像素比的超详细讲…...

Revisiting Distributed Synchronous SGD 带有Back-up机制的分布式同步SGD方法 论文精读

论文链接&#xff1a;Revisiting Distributed Synchronous SGD ABS 本文介绍了用于分布式机器学习的同步和异步SGDSGDSGD&#xff0c;同时指出各自的缺点&#xff1a;stragglersstragglersstragglers和stalenessstalenessstaleness。 同时为了解决同步SGDSGDSGD存在straggle…...

shiro CVE-2020-13933

0x00 前言 同CVE-2020-1957&#xff0c;补充一下笔记&#xff0c;在CVE-2020-1957的基础上进行了绕过。 影响版本&#xff1a;Apache Shiro < 1.6.0 环境搭建参考&#xff1a;shiro CVE-2020-1957 0x01 漏洞复现 CVE-2020-13933中使用%3b绕过了shiro /*的检测方式&…...

斐波那契数列(递归+迭代)

目录什么是斐波那契数列递归写法使用递归写法的缺点迭代写法(效率高)什么是斐波那契数列 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例…...

2022黑马Redis跟学笔记.实战篇(六)

2022黑马Redis跟学笔记.实战篇 六4.7.达人探店功能4.7.1.分享探店图文1. 达人探店-发布探店笔记2. 达人探店-查看探店笔记4.7.2.点赞功能4.7.3.基于List实现点赞用户列表TOP104.7.4.基于SortedSet实现点赞排行榜4.8.关注列表4.8.1.关注列表实现原理4.8.2.添加关注1. 好友关注-关…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...