百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

源码学习:Java 本地队列 - java.util.Deque

toyiye 2024-07-03 02:17 21 浏览 0 评论

1、接口定义

支持在头尾两端插入和移除元素的线性集合(双端队列:Double Ended Queue,Deque,读音:英[dek]|美[d?k] )。大多数 Deque 实现对于它们可能包含的元素数量没有固定的限制,不过这个接口对容量设限以及没有固定容量限制的那些 Deque 实现都支持。

该接口定义了访问 Deque 两端元素的方法,方法被提供用于插入提取检索操作。这些操作方法都以两种形式存在:一种在操作失败时抛出异常,另一种是返回一个特殊值(根据操作的不同,可以是 nullfalse)。后一种形式的插入操作是专门为使用容量设限的 Deque 实现而设计的;在大多数实现中,插入操作不会失败。

-

抛出异常

返回特殊值

插入

addFirst(e) addLast(e)

offerFirst(e) offerLast(e)

提取/移除

removeFirst() removeLast()

pollFirst() pollLast()

检索/检查

getFirst() getLast()

peekFirst() peekLast()

这个接口继承了 Queue 接口。当使用 Deque 作为 Queue 队列时,会产生 FIFO (先进先出)行为:元素被添加到 Deque 的尾部,然后从头部移除。从 Queue 接口继承的方法精确地等同于 Deque 方法,如下表所示:

Queue 方法

等效 Deque 方法

add(e)

addLast(e)

offer(e)

offerLast(e)

remove()

removeFirst()

poll()

pollFirst()

element()

getFirst()

peek()

peekFirst()

Deque 也可用作 LIFO(后进先出) Stack 堆栈。应该优先使用这个接口,而不是历史遗留的 java.util.Stack。当一个 Deque 被用作堆栈时,元素从该 Deque 的头部被压入和弹出。Stack 方法与 Deque 方法完全等价,如下表所示:

Stack 方法

等效 Deque 方法

push(e)

addFirst(e)

pop()

removeFirst()

peek()

peekFirst()

请注意,当 Deque 被用作 Queue 队列或 Stack 堆栈时,peek() 方法同样有效;在这两种情况下,元素都是从 Deque 的头部提取的。

这个接口还提供了两个方法来移除内部元素,removeFirstOccurrence()removeLastOccurrence()

java.util.List 接口不同,该接口不支持对元素的索引访问。

虽然 Deque 实现并不严格要求禁止插入 null 元素,但强烈建议这样做。任何允许 null 元素的 Deque 实现的使用者都强烈建议不要利用插入 null 元素的能力。这是因为 null 会被各种方法用作特殊的返回值,以表明 Deque 为空。

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

java.util.Deque 继承于 java.util.Queue 接口,接口继承关系如下图所示:

2、方法声明

1)void addFirst(E e);

  • 在不违反容量限制的情况下立即将指定的元素插入到该 Deque 的头部中,当使用容量设限的 Deque 时,通常最好使用 offerFirst() 方法;
  • 如果此时由于容量限制(没有可用空间)而不能添加元素,则抛出 java.lang.IllegalStateException
  • 如果指定元素的类阻止将其添加到此队列中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该队列不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此队列中,则抛出 java.lang.IllegalArgumentException

2)void addLast(E e);

  • 在不违反容量限制的情况下立即将指定的元素插入到该 Deque 的尾部中,当使用容量设限的 Deque 时,通常最好使用 offerLast() 方法;
  • 如果此时由于容量限制(没有可用空间)而不能添加元素,则抛出 java.lang.IllegalStateException
  • 如果指定元素的类阻止将其添加到此队列中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该队列不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此队列中,则抛出 java.lang.IllegalArgumentException

3)boolean offerFirst(E e);

  • 将指定的元素插入到 Deque 的头部,除非它违反容量限制,成功时返回 true,否则返回 false。当使用容量设限的队列时,这个方法通常比 addFirst() 更适合使用,因为在不能添加元素时,addFirst() 方法只能抛出异常;
  • 如果指定元素的类阻止将其添加到此队列中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该队列不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此队列中,则抛出 java.lang.IllegalArgumentException

4)boolean offerLast(E e);

  • 将指定的元素插入到 Deque 的尾部,除非它违反容量限制,成功时返回 true,否则返回 false。当使用容量设限的队列时,这个方法通常比 addLast() 更适合使用,因为在不能添加元素时,addLast() 方法只能抛出异常;
  • 如果指定元素的类阻止将其添加到此队列中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该队列不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此队列中,则抛出 java.lang.IllegalArgumentException

5)E removeFirst();

  • 检索并移除该 Deque 的第一个元素(头部元素)。此方法与 pollFirst() 的不同之处在于:当该 Deque 为空时,则抛出异常;
  • 如果该 Deque 为空,则抛出 java.util.NoSuchElementException

6)E removeLast();

  • 检索并移除该 Deque 的最后一个元素(尾部元素)。此方法与 pollLast() 的不同之处在于:当该 Deque 为空时,则抛出异常;
  • 如果该 Deque 为空,则抛出 java.util.NoSuchElementException

7)E pollFirst();

  • 检索并移除该 Deque 的第一个元素(头部元素),如果该 Deque 为空,则返回 null

8)E pollLast();

  • 检索并移除该 Deque 的最后一个元素(尾部元素),如果该 Deque 为空,则返回 null

9)E getFirst();

  • 检索(但并不移除)该 Deque 的第一个元素(头部元素)。此方法与 peekFirst() 的不同之处在于:当该 Deque 为空时,则抛出异常;
  • 如果该 Deque 为空,则抛出 java.util.NoSuchElementException

10)E getLast();

  • 检索(但并不移除)该 Deque 的最后一个元素(尾部元素)。此方法与 peekLast() 的不同之处在于:当该 Deque 为空时,则抛出异常;
  • 如果该 Deque 为空,则抛出 java.util.NoSuchElementException

11)E peekFirst();

  • 检索(但并不移除)该 Deque 的第一个元素(头部元素),如果该 Deque 为空,则返回 null

12)E peekLast();

  • 检索(但并不移除)该 Deque 的最后一个元素(尾部元素),如果该 Deque 为空,则返回 null

13)boolean removeFirstOccurrence(Object o);

  • Deque 中移除指定元素的第一个匹配项。如果该 Deque 中不包含该元素,则它不会有所改变。更正式地说,即移除第一个满足 (o==null ? e==null : o.equals(e)) 表达式的元素 e(如果存在这样的元素的话)。如果该 Deque 包含指定的元素则移除它并返回 true
  • 如果指定元素的类型与 Deque 不兼容,则抛出 java.lang.ClassCastException(可选);
  • 如果指定的元素是 null,而这个 Deque 是不允许 null 元素的,则抛出 java.lang.NullPointerException(可选)。

注:“可选”指具体的 Deque 实现可根据自己的实现目的而选择合适的策略,或返回此异常,或返回成功。

14)boolean removeLastOccurrence(Object o);

  • Deque 中移除指定元素的最后一个匹配项。如果该 Deque 中不包含该元素,则它不会有所改变。更正式地说,即移除最后一个满足 (o==null ? e==null : o.equals(e)) 表达式的元素 e(如果存在这样的元素的话)。如果该 Deque 包含指定的元素则移除它并返回 true
  • 如果指定元素的类型与 Deque 不兼容,则抛出 java.lang.ClassCastException(可选);
  • 如果指定的元素是 null,而这个 Deque 是不允许 null 元素的,则抛出 java.lang.NullPointerException(可选)。

— 以下为 Queue 队列方法 —

15)boolean add(E e);

  • 如果可以在不违反容量限制的情况下立即将指定的元素插入到该 Deque 所表示的 Queue 队列中(换句话说,插入到该 Deque 的尾部),则在插入成功时返回 true(如 Collection.add() 所指定的),当使用容量设限的 Deque 时,通常最好使用 offer() 方法。此方法与 addLast() 方法等效
  • 如果此时由于容量限制(没有可用空间)而不能添加元素,则抛出 java.lang.IllegalStateException
  • 如果指定元素的类阻止将其添加到此队列中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该队列不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此队列中,则抛出 java.lang.IllegalArgumentException

16)boolean offer(E e);

  • 如果可以在不违反容量限制的情况下立即将指定的元素插入到该 Deque 所表示的 Queue 队列中(换句话说,插入到该 Deque 的尾部),则在插入成功时返回 true,否则返回 false,当使用容量设限的 Deque 时,这个方法通常比 add() 更适合使用,因为在因容量限制(没有可用空间)而不能添加元素时,add() 方法只能抛出异常。此方法与 offerLast() 方法等效
  • 如果指定元素的类阻止将其添加到此队列中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该队列不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此队列中,则抛出 java.lang.IllegalArgumentException

17)E remove();

  • 检索并移除此 Deque 所表示的 Queue 队列的头部元素(换句话说,移除该 Deque 的第一个元素),此方法与 poll() 方法的不同之处在于:如果队列为空,则抛出异常。此方法与 removeFirst() 方法等效
  • 如果队列为空,则抛出 java.util.NoSuchElementException

18)E poll();

  • 检索并移除此 Deque 所表示的 Queue 队列的头部元素(换句话说,移除该 Deque 的第一个元素),如果队列为空,返回 null此方法与 pollFirst() 方法等效

19)E element();

  • 检索(但并不移除)此 Deque 所表示的 Queue 队列的头部元素(换句话说,检索该 Deque 的第一个元素),此方法与 peek() 方法的不同之处在于:如果队列为空,则抛出异常。此方法与 getFirst() 方法等效
  • 如果队列为空,则抛出 java.util.NoSuchElementException

20)E peek();

  • 检索(但并不移除)此 Deque 所表示的 Queue 队列的头部元素(换句话说,检索该 Deque 的第一个元素),如果队列为空,返回 null此方法与 peekFirst() 方法等效

— 以下为 Stack 堆栈方法 —

21)void push(E e);

  • 在不违反容量限制的情况下立即将一个元素压入到该 Deque 所表示的 Stack 堆栈中(换句话说,压入到该 Deque 的头部)。此方法与 addFirst() 方法等效
  • 如果此时由于容量限制(没有可用空间)而不能添加元素,则抛出 java.lang.IllegalStateException
  • 如果指定元素的类阻止将其添加到此堆栈中,则抛出 java.lang.ClassCastException
  • 如果指定的元素为 null 且该堆栈不允许 null 元素,则抛出 java.lang.NullPointerException
  • 如果此元素的某些属性阻止将其添加到此堆栈中,则抛出 java.lang.IllegalArgumentException

22)E pop();

  • 从这个 Deque 所表示的 Stack 堆栈中弹出一个元素。换句话说,移除并返回该 Deque 的第一个元素。此方法与 removeFirst() 方法等效
  • 如果堆栈为空,则抛出 java.util.NoSuchElementException

— 以下为 Collection 集合方法 —

23)boolean remove(Object o);

  • Deque 中移除指定元素的第一个匹配项。如果该 Deque 中不包含该元素,则它不会有所改变。更正式地说,即移除第一个满足 (o==null ? e==null : o.equals(e)) 表达式的元素 e(如果存在这样的元素的话)。如果该 Deque 包含指定的元素则移除它并返回 true此方法与 removeFirstOccurrence(Object o) 方法等效
  • 如果指定元素的类型与 Deque 不兼容,则抛出 java.lang.ClassCastException(可选);
  • 如果指定的元素是 null,而这个 Deque 是不允许 null 元素的,则抛出 java.lang.NullPointerException(可选)。

24)boolean contains(Object o);

  • 如果 Deque 包含指定的元素时返回 true。更正式地说,当且仅当这个 Deque 至少包含一个满足 (o==null ? e==null : o.equals(e)) 表达式的元素 e 时返回 true
  • 如果指定元素的类型与 Deque 不兼容,则抛出 java.lang.ClassCastException(可选);
  • 如果指定的元素是 null,而这个 Deque 是不允许 null 元素的,则抛出 java.lang.NullPointerException(可选)。

25)public int size();

  • 返回 Deque 中包含的元素的数量。

26)Iterator<E> iterator();

  • 按照顺序返回 Deque 中所有元素的迭代器,元素将按从头到尾的顺序返回。

27)Iterator<E> descendingIterator();

  • 以反向顺序返回该 Deque 中所有元素的迭代器,元素将按从尾到头的顺序返回。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码