Java集合——12.使用Deque
Java的双端队列Deque
Deque的特性
Deque继承自Queue接口,因此它具备普通队列的所有功能,同时又扩展了新的能力:
- 既可以在队首添加/删除元素,也可以在队尾添加/删除元素
- 既可以查看队首元素,也可以查看队尾元素
- 兼具队列(FIFO)和栈(LIFO)的特性
Deque与Queue的方法对比
Deque在Queue的基础上扩展了更多方法,如下表所示:
| 操作类型 | Queue方法 | Deque对应方法 |
|---|---|---|
| 添加元素到队尾 | add(E e)/offer(E e) |
addLast(E e)/offerLast(E e) |
| 取队首元素并删除 | remove()/poll() |
removeFirst()/pollFirst() |
| 取队首元素但不删除 | element()/peek() |
getFirst()/peekFirst() |
| 添加元素到队首 | 无 | addFirst(E e)/offerFirst(E e) |
| 取队尾元素并删除 | 无 | removeLast()/pollLast() |
| 取队尾元素但不删除 | 无 | getLast()/peekLast() |
方法行为差异
Deque的方法同样分为两类,区别在于操作失败时的处理:
- 以
add/remove/get开头的方法:操作失败时会抛出异常 - 以
offer/poll/peek开头的方法:操作失败时会返回特殊值(false或null)
Deque示例
import java.util.Deque;
import java.util.LinkedList;
public class DequeDemo {
public static void main(String[] args) {
Deque<String> deque = new LinkedList<>();
// 向队尾添加元素
deque.offerLast("A"); // 队列: [A]
deque.offerLast("B"); // 队列: [A, B]
// 向队首添加元素
deque.offerFirst("C"); // 队列: [C, A, B]
System.out.println(deque.pollFirst()); // 输出C,队列变为[A, B]
System.out.println(deque.pollLast()); // 输出B,队列变为[A]
System.out.println(deque.pollFirst()); // 输出A,队列变为空
System.out.println(deque.pollFirst()); // 输出null(队列已空)
}
}
Deque的实现类
Java中常用的Deque实现类有两个:
LinkedList:基于链表实现,适合频繁的插入和删除操作ArrayDeque:基于数组实现,适合频繁的随机访问,性能通常优于LinkedList
使用时应根据具体场景选择合适的实现类,同时遵循面向抽象编程的原则:
// 推荐写法:使用接口作为引用类型
Deque<String> deque = new ArrayDeque<>();
// 而非直接使用实现类作为引用类型
// ArrayDeque<String> deque = new ArrayDeque<>();
总结
- 掌握
Deque的特性,既可以作为FIFO队列使用,也可以作为LIFO栈使用 - 避免添加
null元素:否则可能导致poll等方法返回null时难以判断是元素本身还是队列已空 - 明确使用
First/Last方法可以清晰地表达操作意图。
Java集合——12.使用Deque的更多相关文章
- Java 集合系列 12 TreeMap
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合深入理解(10):Deque 双端队列
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 什么是 Deque Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋 ...
- Java 集合深入理解(12):古老的 Vector
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天刮台风,躲屋里看看 Vector ! 都说 Vector 是线程安全的 ArrayList,今天来根据源码看看是不是这 ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- Java集合面试题
1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1 ...
- Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- 40个Java集合面试问题和答案
Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 另外,码农网之前也整理过一篇关于Java集合面试题的文章:大公司最 ...
- Java集合必会14问(精选面试题整理)
前言:把这段时间复习的关于集合类的东西整理出来,特别是HashMap相关的一些东西,之前都没有很注意1.7 ->> 1.8的变化问题,但后来发现这其实变化挺大的,而且很多整理的面试资料都没 ...
- 【由浅入深理解java集合】(四)——集合 Queue
今天我们来介绍下集合Queue中的几个重要的实现类.关于集合Queue中的内容就比较少了.主要是针对队列这种数据结构的使用来介绍Queue中的实现类. Queue用于模拟队列这种数据结构,队列通常是指 ...
- 第49节:Java集合框架中底层文档的List与Set
Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...
随机推荐
- Linux | base64编码与解码命令
1.base64编码 (1)base64 file 功能:从指定的文件file中读取数据,编码为base64的字符串然后输出: (2)echo "string" | base64 ...
- 敏捷史话(十):我牺牲了滑雪时间,参加了一场软件革命——Jon Kern
"在镜头定格的一刹那,所有美好都和你不期而遇",这是 Jon Kern 对生活的表达.为了更好地记录生活,他在一家名为 flickr 的网站上创建了一个属于自己的照片博客,在这个博 ...
- (包含5w字提示词开源)手把手教你搭建开源提示词优化平台
前言:为什么要自己搭建? 各位技术同学们,还在为ChatGPT的网络限制而苦恼吗?还在担心敏感数据泄露给第三方吗?今天给大家带来一个超级实用的解决方案--自部署AI提示词优化平台! 想象一下: 数据完 ...
- 使用HTML完成一个最low的页面
1 <body> 2 <div style="background: burlywood"> 3 <h1 style="text-align ...
- FFmpeg开发笔记(六十六)Windows给FFmpeg集成LC3音频的编码器liblc3
<FFmpeg开发实战:从零基础到短视频上线>一书的第五章介绍了FFmpeg如何处理常见的MP3音频和AAC音频,其中MP3格式常用于音乐文件,而AAC格式常用于视频文件. 除此以外,近年 ...
- 支付宝小程序IDE版本迭代异常
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,公司项目就是主推uni-app 现公司今年准备新开一 ...
- P4383 [八省联考 2018] 林克卡特树
P4383 [八省联考 2018] 林克卡特树 米奇妙妙题 题目的主要操作就是断掉一条边再连一条边权为\(0\)的边 我们考虑先不连那些后来加上的边权为\(0\)的边,先把所有的需要断的边都断掉,那么 ...
- Web前端入门第 74 问:JavaScript 事件冒泡与事件捕获
在讨论冒泡和捕获之前,先看这么一段代码: <style> .bd { border: 1px solid #000; padding: 8px; } </style> < ...
- 基于混合检索与RRF融合的智能问答系统核心技术解析
引言 在当今信息爆炸的时代,如何快速.精准地从海量知识中定位用户所需信息,成为智能问答系统面临的核心挑战.GC-QA-RAG系统通过创新的向量检索技术和混合检索机制,实现了高效的知识点定位能力.本文将 ...
- 深入研究使用DozerMapper复制List<Ojbect>前后元素类型不一致的问题
背景 某项目某个功能点是接受前端传参,将其存入MongoDB.这个传参的核心数据是一个二维数组List<List<Object>>,可以放字符串.整型,也可以放null. 在测 ...