Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。下图描述的是Deque的完整体系图。需要说明的是LinkedList也已经加入了Deque的一部分(LinkedList是从jdk1.2 开始就存在数据结构)。
Deque在Queue的基础上增加了更多的操作方法。
从上图可以看到,Deque不仅具有FIFO的Queue实现,也有FILO的实现,也就是不仅可以实现队列,也可以实现一个堆栈。
同时在Deque的体系结构图中可以看到,实现一个Deque可以使用数组(ArrayDeque),同时也可以使用链表(LinkedList),还可以同实现一个支持阻塞的线程安全版本队列LinkedBlockingDeque。
对于数组实现的Deque来说,数据结构上比较简单,只需要一个存储数据的数组以及头尾两个索引即可。由于数组是固定长度的,所以很容易就得到数组的头和尾,那么对于数组的操作只需要移动头和尾的索引即可。
特别说明的是ArrayDeque并不是一个固定大小的队列,每次队列满了以后就将队列容量扩大一倍(doubleCapacity()),因此加入一个元素总是能成功,而且也不会抛出一个异常。也就是说ArrayDeque是一个没有容量限制的队列。
同样继续性能的考虑,使用System.arraycopy复制一个数组比循环设置要高效得多。
对于LinkedList本身而言,数据结构就更简单了,除了一个size用来记录大小外,只有head一个元素Entry。对比Map和Queue的其它数据结构可以看到这里的Entry有两个引用,是双向的队列。
在示意图中,LinkedList总是有一个“傀儡”节点,用来描述队列“头部”,但是并不表示头部元素,它是一个执行null的空节点。
队列一开始只有head一个空元素,然后从尾部加入E1(add/addLast),head和E1之间建立双向链接。然后继续从尾部加入E2,E2就在head和E1之间建立双向链接。最后从队列的头部加入E3(push/addFirst),于是E3就在E1和head之间链接双向链接。
双向链表的数据结构比较简单,操作起来也比较容易,从事从“傀儡”节点开始,“傀儡”节点的下一个元素就是队列的头部,前一个元素是队列的尾部,换句话说,“傀儡”节点在头部和尾部之间建立了一个通道,是整个队列形成一个循环,这样就可以从任意一个节点的任意一个方向能遍历完整的队列。
同样LinkedList也是一个没有容量限制的队列,因此入队列(不管是从头部还是尾部)总能成功。
上面描述的ArrayDeque和LinkedList是两种不同方式的实现,通常在遍历和节省内存上ArrayDeque更高效(索引更快,另外不需要Entry对象),但是在队列扩容下LinkedList更灵活,因为不需要复制原始的队列,某些情况下可能更高效。
同样需要注意的上述两个实现都不是线程安全的,因此只适合在单线程环境下使用,下面章节要介绍的LinkedBlockingDeque就是线程安全的可阻塞的Deque。事实上也应该是功能最强大的Queue实现,当然了实现起来也许会复杂一点。
http://www.blogjava.net/xylz/archive/2010/08/12/328587.html
相关推荐
双向队列,又称为deque(双端队列),是Python等语言中的标准库数据结构,它支持在两端进行插入和删除操作。双向队列的灵活性在于,你可以像对待队列一样在一头添加或移除元素,也可以像对待栈一样在另一头进行操作...
12. 双向队列(Deque)双向队列(Deque)是双端队列,支持在两端进行插入和删除操作。Java中的Deque接口有ArrayDeque作为实现类。例如,可以通过以下方式创建Deque:javaDeque<Integer> deque = new ArrayDeque();...
ArrayDeque 是Java中的双向队列(deque)实现,它基于数组实现并可以高效地在两端进行插入和删除操作。 以下是关于 ArrayDeque 的一些重要信息: 双向队列特性:ArrayDeque 支持在队列的两端进行元素的插入和删除...
除了Java标准库提供的集合外,还有其他第三方库提供了额外的集合实现,例如Google Guava库,它提供了更多功能丰富的集合实现,如`Multiset`、`Multimap`等。 #### 七、练习 教程最后包含了一些练习题,帮助读者...
Java集合框架是Java编程语言中一个至关重要的组成部分,它为数据存储、管理和操作提供了丰富的类库。这个框架包括了各种接口、类以及实现,使得开发者能够高效地处理对象的集合,无论是小型还是大型数据集。在Java...
LinkedList是一种以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用。它实现了List、Queue和Deque接口,使其具有多种使用场景。 LinkedList的继承体系中,它继承了AbstractSequentialList和...
Java集合框架是Java编程语言中的一个核心特性,它为存储、管理和操作对象提供了一组高效且灵活的数据结构。本项目“1-Collections-Overview-Section-Java-Collections-S_overview”着重于概述Java集合框架的基本概念...
### Java集合框架经典面试题详解 #### 1. Java集合框架概述及优点 - **定义**: Java集合框架是一个设计模式,用于组织和操纵对象集合。它由一系列接口、实现类和算法组成,提供了统一的方式管理和操作数据集合。...
5. **集合框架**:Java的集合框架是处理各种数据结构的核心,包括`ArrayList`、`HashSet`、`HashMap`等。源码将揭示这些类如何维护元素、实现遍历以及确保性能的关键细节。 6. **树结构**:树是一种非线性的数据...
根据给定文件的信息,我们可以提炼出以下关于Java集合的关键知识点: ### 1. Java集合概述与常见类 Java集合框架是Java平台的核心组件之一,它为开发者提供了多种数据结构来存储和操作对象集合。Java集合主要包括...
在Java集合框架中,主要有六种核心接口:`Collection`, `Set`, `List`, `Queue`, `Deque`, 和 `Map`。此外,还有五个抽象类以及多个实现类,它们共同构成了Java集合框架的基础。 #### 二、核心接口介绍 1. **`...
Java集合框架是Java编程语言中的一个核心特性,它为存储、管理和操作对象提供了一组统一的接口和类。本章内容主要围绕Java集合框架展开,包括ArrayList、LinkedList、HashSet、HashMap等常见数据结构的使用方法及其...
- 可用作队列、栈或双向队列。 - 不支持随机访问。 #### 六、ArrayList类 `ArrayList`类也是`List`接口的一种实现,它基于动态数组实现。 - **主要特点**: - 提供随机访问能力。 - 添加和删除操作的成本较高...
- **`Deque`**:双端队列,允许从两端进行插入和删除操作。 - **`SortedSet`** 和 **`SortedMap`**:分别继承自`Set`和`Map`,提供了排序的功能。 ##### 2. 抽象类 Java集合框架还提供了一些抽象类,这些抽象类...
双端队列(Deque) 循环队列 哈希表(HashTable) 树形数据结构 二叉树(BinaryTree)、二叉搜索树(BinarySearchTree、BST) 平衡二叉搜索树(BalancedBinarySearchTree、BBST) AVL树(AVLTree)、红黑树...
以上只是Java集合框架的一部分核心概念,实际开发中还有许多其他类和接口,如Deque(双端队列)、NavigableSet(可导航的集合)等,都为开发者提供了丰富的选择和强大的功能。理解和熟练使用Java集合框架,是成为一...
Java集合框架是Java编程语言中不可或缺的一部分,它为开发者提供了数据结构和算法的实现,使得在处理对象集合时更加高效和便捷。在这个“java资料各种集合”中,我们可以期待找到关于Java集合框架的各种深入讲解和...
Java队列是Java集合框架中的一个关键组成部分,主要用于在多个线程之间同步数据传输或实现异步处理。队列遵循先进先出(FIFO)的原则,即最早添加到队列中的元素将首先被处理。本教程将深入探讨如何在Java中使用队列...
第六章的学习通常会深入探讨Java中的集合框架,这是一个强大的工具,包括多种数据结构,如列表、队列、堆栈、映射等。下面我们将详细讲解Java集合框架及其相关知识点。 1. **集合接口**: - `List`:表示有序的...