Java 程序员,别用 Stack?!

接口 Deque

模块  java.base
软件包  java.util
Interface Deque<E>
参数类型    E - 此双端队列中保留的元素类型

All Superinterfaces:
Collection , Iterable , Queue
All Known Subinterfaces:
BlockingDeque
所有已知实现类:
ArrayDeque , ConcurrentLinkedDeque , LinkedBlockingDeque , LinkedList
public interface Deque
extends Queue

线性集合,支持两端插入和移除元素名称 deque 是“双端队列”的缩写,通常发音为 “deck”。 大多数 Deque 实现对它们可能包含的元素数量没有固定限制,但此接口支持容量限制的 deques 以及没有固定大小限制的 deques。
此接口定义了访问双端队列两端元素的方法。 提供了插入,移除和检查元素的方法。 这些方法中的每一种都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值( null 或 false ,具体取决于操作)。 后一种形式的插入操作专门设计用于容量限制的 Deque 实现; 在大多数实现中,插入操作不会失败。

Summary of Deque methods First Element (Head) Last Element (Tail) Throws exception Special value Throws exception Special value Insert addFirst(e) offerFirst(e) addLast(e) offerLast(e) Remove removeFirst() pollFirst() removeLast() pollLast() Examine getFirst() peekFirst() getLast() peekLast()

此接口扩展了 Queue 接口。 当 deque 用作队列时,会产生 FIFO(先进先出)行为。 元素在双端队列的末尾添加并从头开始删除。 继承自 Queue 接口的方法与 Deque 方法完全等效:
add(e) addLast(e) offer(e) offerLast(e) remove() removeFirst() poll() pollFirst() element() getFirst() peek() peekFirst()

Deques 也可以用作 LIFO(后进先出)堆栈。 应优先使用此接口,而不是旧版 Stack 。 当 deque 用作堆栈时,元素将从双端队列的开头推出并弹出。 堆栈方法相当于 Deque 方法:
push(e) addFirst(e) pop() removeFirst() peek() getFirst()

请注意,当 deque 用作队列或堆栈时, peek 方法同样有效; 在任何一种情况下,元素都是从双端队列的开头绘制的。

与 List 接口不同,此接口不支持对元素的索引访问。

虽然严格要求 Deque 实现禁止插入 null 元素,但强烈建议他们这样做。 任何用户 Deque 强烈建议实现,也允许 null 元素不采取插入空的能力优势。 这是因为 null 被各种方法用作特殊返回值,以指示 deque 为空。

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

此接口是 Java Collections Framework 的成员。

boolean add​(E e) 尾部插入,返回 true 成功时和抛出 IllegalStateException 如果当前没有空间可用的。
boolean addAll​(Collection<? extends E> c) 末尾添加指定集合中的所有元素。
void    addFirst​(E e)
void    addLast​(E e)
boolean offer​(E e) 尾部插入,返回 true 在成功和 false 如果当前没有空间可用。
boolean offerFirst​(E e)
boolean offerLast​(E e)
void    push​(E e) 头部E  poll() 头部删除,如果此双端队列为空,则返回 null 。
E   pollFirst()
E   pollLast()
E   remove() 头部删除
E   removeFirst()
E   removeLast()
E   pop() 从此双端队列表示的堆栈中弹出一个元素。
boolean remove​(Object o) 删除第一次出现的指定元素。
boolean removeFirstOccurrence​(Object o)     删除第一次出现的指定元素。
boolean removeLastOccurrence​(Object o) 删除最后一次出现的指定元素。Iterator<E> descendingIterator() 以相反的顺序返回此双端队列中元素的迭代器。
E   element() 检索但不删除此双端队列表示的队列的头部(换句话说,此双端队列的第一个元素)。
E   getFirst() 头部检索
E   getLast()
E   peek() 头部检索,如果此双端队列为空,则返回 null 。
E   peekFirst()
E   peekLast() Iterator<E> iterator() 以适当的顺序返回此双端队列中元素的迭代器。
boolean contains​(Object o) 包含指定的元素,返回 true 。
int size() 返回此双端队列中的元素数。

声明方法的接口 java.util.Collection
clear, containsAll, equals, hashCode, isEmpty, parallelStream, removeAll, removeIf, retainAll, spliterator, stream, toArray, toArray, toArray

声明方法的接口 java.lang.Iterable
forEach

queue 的增加元素方法 add 和 offer 的区别在于,add 方法在队列满的情况下将选择抛异常的方法来表示队列已经满了,而 offer 方法通过返回 false 表示队列已经满了;在有限队列的情况,使用 offer 方法优于 add 方法;

remove 方法和 poll 方法都是删除队列的头元素,remove 方法在队列为空的情况下将抛异常,而 poll 方法将返回 null;

element 和 peek 方法都是返回队列的头元素,但是不删除头元素,区别在与 element 方法在队列为空的情况下,将抛异常,而 peek 方法将返回 null.

LinkedList

LinkedList 本质是双向链表,是可以当做队列或栈使用的。因为他有 push pop(栈)、addFirst、addLast、removeFirst、removeLast(队列)操作方法,LinkedList 实现了 Queue 接口。

add 与 offer 将 LinkedList 当作链表或队列来使用。而 push 操作是将 LinkedList 当作栈来使用。
add(不带索引默认添加到链表的最后)与 offer一样都是添加操作,唯一的区别就是 offer 没有带索引参数的方法,并且如果队列满了 add 会抛出异常,而 offer 不会。

LinkedList 的取出操作只有 pop 和 get。并且如果一个 LinkedList 中既有 add 或 offer 的添加,又有 push 的添加,那么 pop 操作会先取栈元素,再取队列元素。

ArrayDeque

ArrayDeque 是 Deque 的一个实现。ArrayDeque 俗称数组双端队列,是一种允许我们从俩端进行存取操作的可扩容数组。
ArrayDeque 的底层是由一个数组来实现的,这个数组会在其塞满的时候,把容量扩大一倍。该数组初始化大小为 16,它通过维护俩个指针:head、tail 实现了双端队列。

ArrayDeque 作为栈使用
push(e) addFirst(e) pop() removeFirst() peek() getFirst()

jshell> Deque<Integer> stack = new ArrayDeque<>();
stack ==> []
jshell> stack.push(1) // 头插入
jshell> stack.push(2)
jshell> stack.push(3)
jshell> stack
stack ==> [3, 2, 1]
jshell> stack.pop() // 头删除
$14 ==> 3
jshell> stack.peek() // 检查头部元素
$22 ==> 3

当用户使用 push 方法向其中添加元素时,它会把 head 头指针向前移动一位。
当从栈中弹出一个元素时,它会把 head 位置处的元素设置为 null (这样的话,此元素就可以被垃圾回收),并且把 head 指针向后移动一位。

ArrayDeque 作为队列使用
add(e) addLast(e) offer(e) offerLast(e) remove() removeFirst() poll() pollFirst() element() getFirst() peek() peekFirst()

jshell> Deque<Integer> queue = new ArrayDeque<>();
queue ==> []
jshell> queue.offer(1)
$24 ==> true
jshell> queue.add(2)
$27 ==> true
jshell> queue
queue ==> [1, 2]
jshell> queue.peek()
$34 ==> 1
jshell> queue.poll()
$29 ==> 1

使用 offer 向队列中添加元素,tail 尾指针会向后移动一位。而当用户从队列中拉取一个元素时,它会把 head 位置处的元素设置为 null,并且把 head 指针向后移动一位。

Java Deque相关推荐

  1. java deque,Java Deque接口

    本文概述 Java Deque接口是一个线性集合, 支持两端的元素插入和删除. Deque是"双头队列"的首字母缩写. 和接口声明 public interface Deque e ...

  2. java deque.pop_Java ArrayDeque pop()方法

    Java ArrayDeque pop()方法 java.util.ArrayDeque.pop() 此方法从此双端队列表示的堆栈中弹出一个元素. 1 语法 public E pop() 2 参数 无 ...

  3. java deque.pop_Java - dequeue的介紹及用法

    閱讀時間: 15分鐘 在電腦科學中, dequeue是指a double-ended queue(雙向佇列),一般簡寫為deque,讀音是 deck). Dequeue是一種抽象資料型態,dequeu ...

  4. 为什么子孙后代会讨厌使用java.util.Stack

    在我用无意义的重言式杀死你之前,这是要点 如果您的应用程序接近实时,或者将代码发送到Mars,则需要保留Java中默认的Stack实现. 根据LinkedList编写您自己的版本. 同样,如果您的应用 ...

  5. java iterator_Java ArrayDeque iterator()方法与示例

    java iterator ArrayDeque类iterator()方法 (ArrayDeque Class iterator() method) iterator() Method is avai ...

  6. list deque java_Java Deque 接口

    Java Deque 接口 在本教程中,我们将学习Deque接口,如何使用它及其方法. Java集合框架的Deque接口提供了双端队列(Deque)的功能.它继承了Queue接口. 双端队列的工作原理 ...

  7. 数据结构思维 第六章 树的遍历

    第六章 树的遍历 原文:Chapter 6 Tree traversal 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章将介绍一个 Web 搜索引擎,我们将在本书其余部分开 ...

  8. java lifo 队列_1.8 Java 队列 Queue、双端队列 Deque - Java 知识总结与学习

    queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.除了基本的 Collection 操作外,队列还 ...

  9. Java中的queue和deque

    2019独角兽企业重金招聘Python工程师标准>>> 1.Queue 队列, 一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则.Java中,Linke ...

  10. Java队列 Deque

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120828826 本文出自[赵彦军的博客] Java队列 Queue Java队列 ...

最新文章

  1. SAP ABAP OLE 输出数据到 Excel 无法自动保存的解决
  2. C#(.net)中的一次连接数据库执行多条sql语句
  3. 更改windows2003远程最大连接数
  4. 全栈深度学习第3期: 怎样科学管理实验数据?
  5. idea mysql错误提示_idea提示错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  6. Broadwell I7-5775c/5675c BSOD 蓝屏问题
  7. 剑指offer——python【第16题】合并两个有序链表
  8. 深入理解viewport及相关属性的关系
  9. 定时任务的时间设置-Cron表达式
  10. 小米5S TWRP刷面具、EdXposed
  11. 微信小程序怎么安装使用WeUI组件
  12. android 仿微信demo————注册功能实现(服务端)
  13. Apache BookKeeper
  14. python爬虫实现音乐下载
  15. java计算机毕业设计公交线路查询系统MyBatis+系统+LW文档+源码+调试部署
  16. 自定义element中的table表格动态获取表头
  17. hanoi塔 python
  18. 安卓apk文件使用命令行进行V1和V2签名
  19. Redis 常用命令的学习
  20. 问题导向VS目标导向

热门文章

  1. c语言 java 嵌入式_嵌入式C语言编译器
  2. python 做网站的工具_程序员最爱的网站克隆爬取工具- HTTrack
  3. HBase数据库结构、存储理解(举例解释、容易理解、深入浅出)
  4. 皮肤html代码大全,清新QQ空间免费皮肤代码大全(可用)
  5. python银行系统-python实现简单银行管理系统
  6. 人人都该懂点儿TCP
  7. C#winform【在状态栏显示实时时间】--实战练习一
  8. 连接linux工具Mtr,Mac、linux和windows mtr路径探测工具安装使用
  9. cactiez mysql密码_CactiEZ中文解决方案+使用教程(1)
  10. 用vba加载宏求地图分幅