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 有序 ...
随机推荐
- 基于注解@Aspect实现Spring AOP
摘要:基于注解@Aspect实现Spring AOP切面编程. 目录 基于注解@Aspect实现Spring AOP 小结 Reference 基于注解@Aspect实现Spring AOP Sp ...
- Vue 学习笔记 [Part 4]
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 一. 组件化开发 1.1. 父子组件的访问 1.2. slot的使用 二. 前端模块化 2.1. 为什么要使用模块化 2.2. ES6中模块化 ...
- 接口被刷百万QPS,怎么防?
大家好,我是苏三. 今天我们不聊风花雪月,只讲这个让无数开发者夜不能寐的终极命题:当恶意流量如海啸般扑来,如何守住你的系统防线? 有些小伙伴在工作中可能经历过接口被刷的噩梦,但百万QPS量级的攻击完全 ...
- kubernetes集群实用操作
一.查看日志 说明:输出Pod中一个容器的日志信息,如果pod只包含一个容器则可以省略容器名. kubectl logs [-f] [-p] POD [-c CONTAINER] 举例说明 # 返回包 ...
- Altair官方文档——HyperMesh的使用与帮助
1.1.3 启动 HyperMesh (1) On PC • 从起始菜单,选择 All Programs >Altair HyperWorks (version) > HyperMesh ...
- DotTrace系列:7. 诊断 托管和非托管 内存暴涨
一:背景 1. 讲故事 分析托管和非托管内存暴涨,很多人潜意识里都会想到抓dump上windbg分析,但我说可以用dottrace同样分析出来,是不是听起来有点让人惊讶,哈哈,其实很正常,它是另辟蹊径 ...
- 在 SQL Server 中 你可以使用以下查询来找到引用 的 FOREIGN KEY 约束
SELECT f.name AS ForeignKeyName, OBJECT_NAME(f.parent_object_id) AS ReferencingTable, COL_NAME(fc.pa ...
- wr30u刷机刷三方系统
前置工作 准备文件 提前下载好本教程中用到的所有资源 为了方便大家,我都整理好了,点击这里不限速免费下载. 说一下资料来源,感兴趣的可以看一下: hanwckf_uboot:第三方uboot,来自于h ...
- volta初步使用
前言 volta是用于管理nodejs和包管理器的工具. 类似的工具还有很多,比如nvm.n等. 除了node之外 volta还可以控制包管理工具,比如 yarn.cnpm.npm. 当然如果你使用的 ...
- 利用PS调整图片光线明暗不均的情况
根据光源角度,利用快速蒙版和渐变工具选择暗区,借用曲线工具调整亮度,达到整体平衡 快速蒙版 渐变工具 使用黑白渐变从光线暗部拉到光线亮部,使图片蒙上一层渐变的红色 反选 取消快速蒙版,此时图片上会出现 ...