首页 > 编程语言 >【Java 数据结构及算法实战】系列 013:Java队列07——双端队列Deque

【Java 数据结构及算法实战】系列 013:Java队列07——双端队列Deque

时间:2023-01-15 10:01:30浏览次数:42  
标签:Deque Java 队列 双端 元素 接口 方法


双端队列(Deque),顾名思义是可以在队列的两端插入和移除元素的特殊队列。

Java提供了java.util.Deque<E>接口以提供对双端队列的支持。该接口是Java Collections Framework的一个成员。

1.   Deque的方法

这个java.util.Deque<E>接口接口定义了访问Deque两端元素的方法,包括插入、删除和检查元素的方法。这些方法都以两种形式存在:

l  一种是如果操作失败则抛出异常;

l  另一种是返回一个特殊值(根据操作的不同返回null或false)。

后一种形式的插入操作是专门为容量受限的Deque实现而设计的。在大多数实现中,插入操作不会失败。

这些方法总结如下:

Deque方法总结

                                                                                         

队首

队尾

抛异常

特殊值

抛异常

特殊值

插入

addFirst(e)

offerFirst(e)

addLast(e)

offerLast(e)

移除

removeFirst()

pollFirst()

removeLast()

pollLast()

检查

getFirst()

peekFirst()

getLast()

peekLast()

2.   Deque用作队列

Deque扩展了Queue接口。这意味着,当Deque作为队列使用时,拥有FIFO行为的结果。元素添加在Deque的末尾,并从队首处删除。从Queue接口继承的方法与Deque方法完全等效,如下表所示:

Queue和Deque方法的比较

                                                    

Queue

Deque

add(e)

addLast(e)

offer(e)

offerLast(e)

remove()

removeFirst()

poll()

pollFirst()

element()

getFirst()

peek()

peekFirst()

3.   Deque用作栈

Deque也可以用作LIFO的栈。这个接口应该优先于旧版的Stack类使用。当一个Deque作为栈使用时,元素从Deque开始被推入并弹出。堆栈方法与Deque方法等效,如下表所示:

Stack和Deque方法的比较

                                        

Stack

Deque

push(e)

addFirst(e)

pop()

removeFirst()

peek()

getFirst()

请注意,当一个Deque用作一个队列或堆栈时,peek()方法同样有效。在这两种情况下,元素都是从Deque的队首开始的。

Deque接口提供了两种方法来移除内部元素,即removeFirstOccurrence和removeLastOccurrence。 与List接口不同,此Deque不提供对元素的索引访问支持。

尽管Deque实现不是严格要求禁止插入空元素,但是强烈建议任何允许空元素的Deque实现的用户不要利用插入空元素的能力。这是因为null被各种方法用作一个特殊的返回值来指示Deque为空。

Deque实现通常不定义equals和hashCode方法的基于元素的版本,而是从类Object继承基于标识的版本。

4.   参考引用

本系列归档至《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版)

标签:Deque,Java,队列,双端,元素,接口,方法
From: https://blog.51cto.com/u_9427273/6008242

相关文章

  • 【Java数据结构及算法实战】系列008:Java队列02——阻塞队列BlockingQueue
    阻塞队列(BlockingQueue)是一种支持额外操作的队列,这两个附加的操作是:l  在队列为空时,获取元素的线程会等待队列变为非空。l  当队列满时,存储元素的线程会等待队列可用。J......
  • Docker部署Java项目运行命令脚本
    项目名称x-schools-server部署教程cd/app/webapps/x-schools-server#全部移除cd/app/webapps/x-schools-serverdockerstop$(dockerps-aqf"name=x-schools-......
  • Java 设置windows系统Maven 环境变了
    ::添加环境变量BAT_HOME@echooffecho添加bat环境变量setregpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environmentsetevname......
  • Java使用MyBatis-Plus生成动态数据库表XML配置
    <updateid="createSpiderTable"parameterType="com.quanchengle.app.spider.CreateSpiderTableAndTableName">CREATETABLEIFNOTEXISTS${tableName}(<if......
  • 04.Java基础语法
    一元运算符Java基础语法一、注释、标识符、关键字注释Java中的注释有三种:​ 单行注释​ 多行注释​ 文档注释publicclassHello_World{//两个斜杠就是一个......
  • Java反射机制
    概念反射是Java的特征之一,是一种间接操作目标对象的机制在JVM运行的时候会动态加载类,对于任意一个类都能获取到该类的所有属性和方法,对于任意一个对象,都能够调用它的任意......
  • java中的基本类型
    引入我们前面使用过了输出语句System.out.println();知道了它能够输出()里的东西但是它到底能够输出一些什么东西呢,或者直奔主题它能够输出什么类型呢可以尝试一下,如果我......
  • Java JDK1.8的安装详细教程
    转载:https://www.jb51.net/article/243119.htmjdk1.8又称jdk8.0,是目前相对比较稳定的版本,不建议下载最新的jdk版本,因为最新版的jdk不稳定,在Java的学习中可能会出现各种各......
  • spark任务报错java.io.IOException: Failed to send RPC xxxxxx to xxxx:xxx, but got
    ##日志信息如下```Attemptedtogetexecutorlossreasonforexecutorid17atRPCaddress192.168.48.172:59070,butgotnoresponse.Markingasslavelost.......
  • 【JavaScript】使用WdatePicker.js插件限选一个时间范围(例如一个月)
    需求:公司处理的业务数据比较大,单张表就是几十上百万的。如果不加入指定的条件,指定的时间,限定条数的查。经过多张表的关联查询sql执行速度将会变得特别慢。之前限定时间都是......