双端列表 —— Deque 接口概述,使用ArrayDeque实现队列和双端队列数据结构

Deque接口简介
Deque译为双端队列,在双向都能作为队列来使用,同时可用作栈。Deque接口的方法是对称成比例的。
Deque接口继承Queue接口,因此具有Queue,Collection,Iterable的方法属性。
双端队列的工作原理
在常规队列中,元素是从后面添加的,而从前面删除的。但是,在双端队列中,我们可以从前后插入和删除元素。


实现Deque的类
为了使用Deque接口的功能,我们需要使用实现接口的类:
-
ArrayDeque
-
LinkedList


如何使用Deque?
在Java中,我们必须导入要使用Deque的包 java.util.Deque 。
Deque<String> animal1 = new ArrayDeque<>();Deque<String> animal2 = new LinkedList<>();
在这里,我们分别创建了类ArrayDeque和LinkedList的对象animal1和animal2。 这些对象可以使用Deque接口的功能。
Deque的方法
Deque接口定义了以下方法:
| 方法 | 描述 |
|---|---|
void addFirst(E e) | 将元素插入此deque的开头 |
void addLast(E e) | 将元素插入此deque的末尾 |
boolean offerFirst(E e) | 在此deque的开头插入指定元素。 |
boolean offerLast(E e) | 在此deque的末尾插入指定元素。 |
E removeFirst() | 检索并删除此deque的第一个元素 |
E removeLast() | 检索并删除此deque的最后一个元素 |
E pollFirst() | 检索并删除此deque的第一个元素;如果deque为空,则返回null |
E pollLast() | 检索并删除此deque的最后一个元素;如果deque为空,则返回null |
E getFirst() | 检索但不删除此deque的第一个元素。 |
E getLast() | 检索但不删除此deque的最后一个元素。 |
E peekFirst() | 检索但不删除此deque的第一个元素;如果deque为空,则返回null |
E peekLast() | 检索但不删除此deque的最后一个元素;如果deque为空,则返回null |
boolean removeFirstOccurrence(Object o) | 从deque中删除第一次出现的指定元素(从头部到尾部遍历deque时)。 |
boolean removeLastOccurrence(Object o) | 从deque中删除最后一次出现的指定元素(从头部到尾部遍历deque时)。 |
boolean add(E e) | 将指定元素添加到此deque的末尾。 |
boolean offer(E e) | 将指定元素添加到此deque的末尾。 |
E remove() | 检索并删除此deque的头部。 |
E poll() | 检索并删除此deque的头部;如果deque为空,则返回null。 |
E element() | 检索但不删除此deque的头部。 |
E peek() | 检索但不删除此deque的头部;如果deque为空,则返回null。 |
void push(E e) | 将元素推入此deque的堆栈层次结构中,也就是在deque的头部插入一个元素。 |
E pop() | 从此deque表示的堆栈处弹出一个元素,也就是把deque的头部元素移除掉。 |
boolean contains(Object o) | 如果此deque包含指定元素,则返回true。 |
int size() | 返回deque中的元素数。 |
Iterator<E> iterator() | 返回一个按元素插入顺序遍历此deque中元素的迭代器。 |
Iterator<E> descendingIterator() | 返回一个按元素逆序遍历此deque中元素的迭代器。 |
双端队列作为堆栈数据结构
Java Collections框架的Stack类提供了堆栈的实现。
但是,建议Deque用作堆栈而不是Stack类。这是因为Stack的方法是同步的。
以下是Deque接口提供的用于实现堆栈的方法:
-
push() - 在双端队列的开头添加元素
-
pop() - 从双端队列的开头删除元素
-
peek() - 从双端队列的开头返回一个元素
Deque是可以用作栈或队列的,具体是哪个取决于使用哪些方法。下面是一些示例代码,演示了如何使用Deque接口。
1. 使用Deque作为队列
import java.util.Deque;
import java.util.LinkedList;public class Deque{public static void main(String[] args) {Deque<String> queue = new LinkedList<>();// 添加元素到队列queue.add("Java");queue.add("C++");queue.add("Python");// 获取队列的第一个元素,不删除System.out.println("First element of queue: " + queue.peek());// 获取并删除队首元素String firstElement = queue.poll();System.out.println("Removed first element of queue: " + firstElement);// 队列中添加一个新元素queue.offer("JavaScript");// 遍历队列中的元素System.out.println("All elements of queue:");for (String element : queue) {System.out.println(element);}}
}
此代码将Deque用作队列,使用add方法添加元素,并使用peek获取第一个元素。然后,使用poll方法删除并获取队列中的第一个元素,并使用offer方法将新元素添加到队列末尾。最后,使用for-each循环遍历队列中的所有元素。
2. 使用Deque作为栈
import java.util.Deque;
import java.util.LinkedList;public class Deque{public static void main(String[] args) {Deque<String> stack = new LinkedList<>();// 将元素推入栈中stack.push("Java");stack.push("C++");stack.push("Python");// 获取栈顶元素,不删除System.out.println("Top element of stack: " + stack.peek());// 获取并删除栈顶元素String topElement = stack.pop();System.out.println("Removed top element of stack: " + topElement);// 将新元素推入栈中stack.push("JavaScript");// 遍历栈中的所有元素System.out.println("All elements of stack:");for (String element : stack) {System.out.println(element);}}
}
此代码演示了如何将Deque用作栈。它使用push方法将元素推入栈中,并使用peek获取栈顶元素。然后,使用pop方法获取并删除栈顶元素,并使用push方法将新元素推入栈顶。最后,使用for-each循环遍历栈中的所有元素。
创建ArrayDeque
为了创建ArrayDeque双端队列,我们必须导入java.util.ArrayDeque包。
这是我们可以用Java创建ArrayDeque双端队列的方法:
ArrayDeque<Type> animal = new ArrayDeque<>();
在此,Type表示ArrayDeque双端队列的类型。例如,
//创建字符串类型ArrayDeque
ArrayDeque<String> animals = new ArrayDeque<>();//创建整数类型ArrayDeque
ArrayDeque<Integer> age = new ArrayDeque<>();
ArrayDeque方法
ArrayDeque类提供了所有的存在于方法Queue和Deque接口。
将元素插入双端队列
1.使用add(),addFirst()和addLast()添加元素
add() - 将指定的元素插入ArrayDeque双端队列的末尾
addFirst() -在ArrayDeque双端队列的开头,插入指定的元素
addLast() - 在ArrayDeque双端队列的末尾插入指定的内容(等效于add())
注意:如果ArrayDeque双端队列已满,则所有这些方法add(),addFirst()和addLast()都会引发IllegalStateException。
例如:
import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();//使用add ()animals.add("Dog");//使用addFirst ()animals.addFirst("Cat");//使用addLast()animals.addLast("Horse");System.out.println("ArrayDeque: " + animals);}
}
输出结果
ArrayDeque: [Cat, Dog, Horse]
2.使用 offer(),offerFirst()和offerLast()插入元素
offer() - 将指定的元素插入ArrayDeque双端队列的末尾
offerFirst() - 在ArrayDeque双端队列的开始处插入指定的元素
offerLast() - 将指定的元素插入ArrayDeque双端队列的末尾
注意: offer(),offerFirst()并offerLast()返回true是否成功插入元素;否则,返回。如果ArrayDeque双端队列已满,则这些方法返回false。
例如:
import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();//使用offer()animals.offer("Dog");//使用offerFirst()animals.offerFirst("Cat");//使用offerLast()animals.offerLast("Horse");System.out.println("ArrayDeque: " + animals);}
}
输出结果
ArrayDeque: [Cat, Dog, Horse]
访问ArrayDeque元素
1.使用getFirst()和getLast()访问元素
getFirst() - 返回ArrayDeque双端队列的第一个元素
getLast() - 返回ArrayDeque双端队列的最后一个元素
注:如果ArrayDeque双端队列为空,getFirst()和getLast()抛出NoSuchElementException。
例如:
import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Horse");System.out.println("ArrayDeque: " + animals);// 获取第一个元素String firstElement = animals.getFirst();System.out.println("第一个元素: " + firstElement);//获取最后一个元素String lastElement = animals.getLast();System.out.println("最后一个元素: " + lastElement);}
}
输出结果
ArrayDeque: [Dog, Cat, Horse]
第一个元素: Dog
最后一个元素: Horse
2.使用peek(),peekFirst()和peekLast()方法访问元素
peek() - 返回ArrayDeque双端队列的第一个元素
peekFirst() - 返回ArrayDeque双端队列的第一个元素(等效于peek())
peekLast() - 返回ArrayDeque双端队列的最后一个元素
例如:
import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Horse");System.out.println("ArrayDeque: " + animals);//使用peek()String element = animals.peek();System.out.println("头元素: " + element);//使用peekFirst()String firstElement = animals.peekFirst();System.out.println("第一个元素: " + firstElement);//使用peekLastString lastElement = animals.peekLast();System.out.println("最后一个元素: " + lastElement);}
}
输出结果
ArrayDeque: [Dog, Cat, Horse]
Head Element: Dog
第一个元素: Dog
最后一个元素: Horse
注意:如果ArrayDeque双端队列为空,peek(),peekFirst()和getLast()抛出NoSuchElementException。
删除 ArrayDeque 元素
1.使用remove(),removeFirst(),removeLast()方法删除元素
remove() - 返回并从ArrayDeque双端队列的第一个元素中删除一个元素
remove(element) - 返回并从ArrayDeque双端队列的头部删除指定的元素
removeFirst() - 返回并从ArrayDeque双端队列中删除第一个元素(等效于remove())
removeLast() - 返回并从ArrayDeque双端队列中删除最后一个元素
注意:如果数组双端队列为空,则remove(),removeFirst()和removeLast()方法将引发异常。 另外,如果找不到元素,则remove(element)会引发异常。
例如:
import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Cow");animals.add("Horse");System.out.println("ArrayDeque: " + animals);//使用remove()String element = animals.remove();System.out.println("删除Element: " + element);System.out.println("新的ArrayDeque: " + animals);//使用removeFirst()String firstElement = animals.removeFirst();System.out.println("删除第一个元素: " + firstElement);//使用removeLast()String lastElement = animals.removeLast();System.out.println("删除最后一个元素: " + lastElement);}
}
输出结果
ArrayDeque: [Dog, Cat, Cow, Horse]
删除Element: Dog
新的ArrayDeque: [Cat, Cow, Horse]
删除第一个元素: Cat
删除最后一个元素: Horse
2.使用poll(),pollFirst()和pollLast()方法删除元素
poll() - 返回并删除ArrayDeque双端队列的第一个元素
pollFirst() - 返回并删除ArrayDeque双端队列的第一个元素(等效于poll())
pollLast() - 返回并删除ArrayDeque双端队列的最后一个元素
注意:如果ArrayDeque双端队列为空,则如果找不到该元素,则poll(),pollFirst()和pollLast()返回null。
例如:
import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Cow");animals.add("Horse");System.out.println("ArrayDeque: " + animals);//使用poll()String element = animals.poll();System.out.println("删除Element: " + element);System.out.println("新的ArrayDeque: " + animals);//使用pollFirst()String firstElement = animals.pollFirst();System.out.println("删除第一个元素: " + firstElement);//使用pollLast()String lastElement = animals.pollLast();System.out.println("删除最后一个元素: " + lastElement);}
}
输出结果
ArrayDeque: [Dog, Cat, Cow, Horse]
删除Element: Dog
新的ArrayDeque: [Cat, Cow, Horse]
删除第一个元素: Cat
删除最后一个元素: Horse
3.删除元素:使用clear()方法
要从ArrayDeque双端队列中删除所有元素,我们使用clear()方法。例如:
import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Horse");System.out.println("ArrayDeque: " + animals);//使用clear()animals.clear();System.out.println("新的ArrayDeque: " + animals);}
}
输出结果
ArrayDeque: [Dog, Cat, Horse]
新的ArrayDeque: []
迭代遍历ArrayDeque
iterator() - 返回可用于遍历ArrayDeque双端队列的迭代器
descendingIterator() -返回一个迭代器,该迭代器可用于以相反顺序遍历ArrayDeque双端队列
为了使用这些方法,我们必须导入java.util.Iterator包。例如:
import java.util.ArrayDeque;
import java.util.Iterator;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Horse");System.out.print("ArrayDeque: ");//使用iterator()Iterator<String> iterate = animals.iterator();while(iterate.hasNext()) {System.out.print(iterate.next());System.out.print(", ");}System.out.print("\n反向ArrayDeque: ");//使用descendingIterator()Iterator<String> desIterate = animals.descendingIterator();while(desIterate.hasNext()) {System.out.print(desIterate.next());System.out.print(", ");}}
}
输出结果
ArrayDeque: [Dog, Cat, Horse]
反向ArrayDeque: [Horse, Cat, Dog]
其他方法
| 方法 | 内容描述 |
|---|---|
| element() | 从ArrayDeque双端队列的头部返回一个元素。 |
| contains(element) | 在ArrayDeque双端队列中搜索指定的元素。 如果找到该元素,则返回true,否则返回false。 |
| size() | 返回ArrayDeque双端队列的长度。 |
| toArray() | 将ArrayDeque双端队列转换为数组并返回。 |
| clone() | 创建ArrayDeque双端队列的副本并返回它。 |
ArrayDeque作为堆栈
要在Java中实现LIFO(后进先出)堆栈,建议在Stack类上使用双端队列。该ArrayDeque类比Stack类快。
ArrayDeque 提供了以下可用于实现堆栈的方法。
push() - 在堆栈顶部添加一个元素
peek() - 从堆栈顶部返回一个元素
pop() - 返回并从堆栈顶部删除元素
例如:
import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> stack = new ArrayDeque<>();//将元素添加到stackstack.push("Dog");stack.push("Cat");stack.push("Horse");System.out.println("Stack: " + stack);//从堆栈顶部访问元素String element = stack.peek();System.out.println("访问元素: " + element);//从堆栈顶部删除元素String remElement = stack.pop();System.out.println("删除element: " + remElement);}
}
输出结果
Stack: [Horse, Cat, Dog]
访问元素: Horse
删除Element: Horse
ArrayDeque与 LinkedList类
ArrayDeque和Java的LinkedList都实现了Deque接口。但是,它们之间存在一些差异。
LinkedList支持空元素,而ArrayDeque不支持。
链表中的每个节点都包含到其他节点的链接。这就是LinkedList比ArrayDeque需要更多存储空间的原因。
如果要实现队列或双端队列数据结构,则ArrayDeque可能比LinkedList快。
相关文章:
双端列表 —— Deque 接口概述,使用ArrayDeque实现队列和双端队列数据结构
Deque接口简介 Deque译为双端队列,在双向都能作为队列来使用,同时可用作栈。Deque接口的方法是对称成比例的。 Deque接口继承Queue接口,因此具有Queue,Collection,Iterable的方法属性。 双端队列的工作原理 在常规队…...
构建可观测架构,从这5个方面着手
随着系统复杂度的提升,“可观测性”(Observability)成为架构建设的重要原则之一。那么构建一个可观测的系统架构需要做哪些工作呢?本文将从以下5个方面介绍构建可观测架构的主要考虑: 1.定义指标和度量,明确关键业务指标需求 首先要确定核心业务指标,比如请求响应…...
前端面试的性能优化部分(7)每天10个小知识点
目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...
【云原生】kubernetes中容器的资源限制
目录 1 metrics-server 2 指定内存请求和限制 3 指定 CPU 请求和限制 资源限制 在k8s中对于容器资源限制主要分为以下两类: 内存资源限制: 内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的…...
java Long型数据返回到前端失进度问题解决
直接在springmvc配置中增加信息转换。亲测可用。简单粗暴 Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {MappingJackson2HttpMessageConverter jackson2HttpMessageConverter new MappingJackson2HttpMessageCo…...
【设计模式】-策略模式:优雅处理条件逻辑
Java 策略模式之优雅处理条件逻辑 前言 在软件开发中,我们经常会遇到根据不同的条件执行不同逻辑的情况。这时,策略模式是一种常用的设计模式,能够使代码结构清晰、易于扩展和维护。 本文将详细介绍策略模式的概念及其在Java中的应用&#x…...
SpringBoot整合多数据源
SpringBoot整合多数据源 在实际企业项目开发中,我们经常会在SpringBoot项目中配置多数据源,一方面可以减缓数据库压力,另一方面可以也是业务需求的场景 下面就来看看如何在SpringBoot项目中配置多数据源 POM 在配置多数据源之前ÿ…...
CLIP论文精度
CLIP论文精度 Zero-shot CLIP多模态模型 Image Endecoder是一个图片编码器,既可以是ResNet,也可以是Vision Transformer. Text Encoder和Image Encoder产生的两组特征进行对比学习(无监督训练) 分类头?“分类头” 是指网络结…...
LouvainMethod分布式运行的升级之路
1、背景介绍 Louvain是大规模图谱的谱聚类算法,引入模块度的概念分二阶段进行聚类,直到收敛为止。分布式的代码可以在如下网址进行下载。 GitHub - Sotera/spark-distributed-louvain-modularity: Spark / graphX implementation of the distri…...
【Node.js】低代码平台源码
一、低代码简介 低代码管理系统是一种通过可视化界面和简化的开发工具,使非专业开发人员能够快速构建和管理应用程序的系统。它提供了一套预先定义的组件和模块,使用户可以通过拖放操作来设计应用程序的界面和逻辑。低代码管理系统还提供了自动化的工作…...
docker 部署 xxl-job-admin
1、先安装mysql docker pull mysql 2、运行mysql 容器 ( 端口 3306 容器名称 mysql 密码 123456 ) docker run -d --name mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 mysql 3、将tables_xxl_job.sql文件(官网地址:http…...
c++(空间配置器)[32]
空间配置器 一级空间配置器 || 二级空间配置器 默认先走二级然后判断 二级空间配置器 一个指针指向start_free然后start_free向后移动,相当于哈希桶的头删和头插 8byte:切大补小 C的二级空间配置器按照8字节(或者更大的倍数)切分…...
Linux系列之解压文件
一.欢迎来到我的酒馆 使用命令解压Linux文件。 目录 一.欢迎来到我的酒馆二.使用命令解压文件 二.使用命令解压文件 2.1解压 .tar.gz文件: tar -zxvf 文件名.tar.gz.tar,gz这种文件是tar文件的压缩文件,因此可以使用tar命令进行解压 -zxvf命令参数&…...
为什么重写equals方法时必须重写hashcode方法
与 equals的区别 如果两个引用类型变量使用运算符,那么比较的是地址,它们分别指向的是否是同一地址的对象,结果一定是false,因为两个对象地址必然不同。 不能实现比较对象的值是否相同。 所有对象都有equals方法,默认…...
java导入excel图片处理
直接看代码吧,主要逻辑吧excel的图片拿到 压缩上传获取url // 将文件转成XSSFWorkbook工作簿XSSFWorkbook wb new XSSFWorkbook(uploadFile);// 获取工作薄中第一个excel表格XSSFSheet sheet wb.getSheetAt(0);// 核心:::获取ex…...
【Rust】Rust学习 第四章认识所有权
第四章认识所有权 所有权(系统)是 Rust 最为与众不同的特性,它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全。因此,理解 Rust 中所有权如何工作是十分重要的。 4.1 所有权 所有运行的程序都…...
学习C语言第三天 :关系操作符、逻辑操作符
1.关系操作符 C语言用于比较的表达式,称为“关系表达式”里面使用的运算符就称(relationalexpression),为“关系运算符” (relationaloperator) ,主要有下面6个。 > 大于运算符 < 小于运算符 > 大于等于运算符 < 小于等…...
Jenkins自动化打包脚本
一、背景 jenkins可以设置定时任务打包,也已手动点按钮打包,还可以通过执行http请求打包,今天我们就通过shell脚本,通过curl命令进行jenkins打包。 二、步骤 2.1 在jenkins上构建项目 设置触发器 2.2 通过shell脚本触发远程构…...
一百五十、Kettle——Kettle官网下载地址
一、官网地址 Home - Hitachi VantaraThe site home pagehttps://community.hitachivantara.com/docs/DOC-1009855 二、下载地址 Pentaho from Hitachi Vantara download | SourceForge.netDownload Pentaho from Hitachi Vantara for free. End to end data integration and…...
使用 Visual Studio Code 调试 CMake 脚本
之前被引入到 Visual Studio 中的 CMake 调试器,现已在 Visual Studio Code 中可用。 也就是说,现在你可以通过在 VS Code 中安装 CMake 工具扩展,来调试你的 CMakeLists.txt 脚本了。是不是很棒? 背景知识 Visual C 开发团队和 CMake 的维…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
