底层使用数组存储元素,同时还使用head和tail来表示索引,但注意tail不是尾部元素的索引,而是尾部元素的下一位,即下一个将要被加入的元素的索引 ArrayDeque的初始化 public ArrayDeque...); } public ArrayDeque(Collection extends E> c) { allocateElements(c.size()); addAll(c); } private...的删除 ArrayDeque支持从头尾两端移除元素,remove方法是通过poll来实现的。...ArrayDeque 没有容量限制,可根据需求自动进行扩容。...ArrayDeque 可以作为栈来使用,效率要高于Stack;ArrayDeque 也可以作为队列来使用,效率相较于基于双向链表的LinkedList也要更好一些 版权声明:本文内容由互联网用户自发贡献
转载请以链接形式标明出处: 本文出自:103style的博客 base on jdk_1.8.0_77 目录 ArrayDeque简介 ArrayDeque的常量和成员变量介绍 ArrayDeque...的构造函数 ArrayDeque相关的函数 小结 参考文章 ---- ArrayDeque简介 ArrayDeque类是双端队列Deque的实现类,类的继承结构如下: public class ArrayDeque...public ArrayDeque() { elements = new Object[16]; } public ArrayDeque(int numElements) { allocateElements...(numElements); } public ArrayDeque(Collection<?...---- 参考文章 Java集合ArrayDeque类解读 ArrayDeque ---- 以上
Constructors in ArrayDeque: ArrayDeque(): Used to create an empty ArrayDeque and by default holds an...("Final ArrayDeque: " + de_que); } } Output: ArrayDeque: [10, 15, 30, 20, 5] ArrayDeque_front_addition...System.out.println("ArrayDeque: " + de_que); } } Output: ArrayDeque: [10, 15, 30, 20, 5] ArrayDeque..., To, Geeks, 4, Geeks] ArrayDeque: [] ArrayDeque size() Method in Java The Java.util.ArrayDeque.size(...main(String args[]) { // Creating an empty ArrayDeque ArrayDeque de_que = new ArrayDeque
接下来再来分析下ArrayDeque的几个重要双端操作。...对于双端队列有哪些重要的双端操作,可以移步至我的之前写的另一篇文章Java中Deque特性及API 在详细介绍ArrayDeque的重要API实现之前,以图解的方式看下ArrayDeque构造函数初始化出的队列的数据结构...: 初始化ArrayDeque后,head和tail都是0,指向数组的0下标位置。...这几个过程正好具有FIFO和LIFO的特点,所以ArrayDeque既可以作为队列Queue又可以作为栈Stack。...具体调用这些基础行为实现的细节,读者可以阅读ArrayDeque源码。
当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。...ArrayDeque和LinkedList是Deque的两个通用实现,由于官方更推荐使用AarryDeque用作栈和队列,加之上一篇已经讲解过LinkedList,本文将着重讲解ArrayDeque的具体实现...从名字可以看出ArrayDeque底层通过数组实现,为了满足可以同时在数组两端插入或删除元素的需求,该数组还必须是循环的,即循环数组(circular array),也就是说数组的任何一点都可能被看作起点或者终点...ArrayDeque是非线程安全的(not thread-safe),当多个线程同时使用的时候,需要程序员手动同步;另外,该容器不允许放入null元素。 ?...由于ArrayDeque中不允许放入null,当elements[head] == null时,意味着容器为空。
ArrayDeque 的结构是一个循环数组,用作栈比Stack 性能优秀,用作队列比LinkedList 要好 ?
当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。...ArrayDeque和LinkedList是Deque的两个通用实现,由于官方更推荐使用AarryDeque用作栈和队列,加之上一篇已经讲解过LinkedList,本文将着重讲解ArrayDeque的具体实现...从名字可以看出ArrayDeque底层通过数组实现,为了满足可以同时在数组两端插入或删除元素的需求,该数组还必须是循环的,即循环数组(circular array),也就是说数组的任何一点都可能被看作起点或者终点...ArrayDeque是非线程安全的(not thread-safe),当多个线程同时使用的时候,需要程序员手动同步;另外,该容器不允许放入null元素。...由于ArrayDeque中不允许放入null,当elements[head] == null时,意味着容器为空。
数组双端队列 ArrayDeque 双端队列,表示可以添加元素到(或删除,获取)队列头也可以添加元素到(或删除,获取)队列尾 1.
# ArrayDeque的两种使用方式 Deque接口是Queue接口的子接口,它代表一个双端队列,该队列允许从两端来操作队列中的元素。Deque不仅可以当成双端队列使用,而且可以当成栈来使用。...ArrayDeque集合是Deque接口的实现类,它是一个基于数组的双端队列,创建Deque时同样可以指定一个numElements参数,该参数用于指定Object[]数组的长度;如果不指定该参数,Deque...# 作为栈使用 验证作为栈使用 public void testStack() { ArrayDeque stack = new ArrayDeque(...Times] the New York Times [Economics, The Times] # 作为队列使用 验证作为队列使用 public void testQueue() { ArrayDeque... queue = new ArrayDeque(); queue.offer("The Times"); queue.offer("Economics
今天分析一下ArrayDeque的源码 ArrayDeque的继承关系图 ArrayDeque实现了Deque接口,内部使用一个可调整大小的数组来存放元素。...ArrayDeque不是线程安全的。不允许添加Null元素。当ArrayDeque 作为一个栈来使用的时候,ArrayDeque 可能会比Stack 快。...当ArrayDeque 作为 队列使用的时候,可能会比 LinkedList 速度要快。...看一下ArrayDeque中几个成员变量 //储存元素的数组,长度总是2的次幂,数组不允许饱和,在使用addX方法添加元素以后,如果数组饱和了,那么就会立即扩容到原来长度的两倍 transient Object...ArrayDeque deque = new ArrayDeque(7); for (int i = 0; i < 8; i++) { deque.addFirst
构造方法 ArrayDeque 一共有 3 个构造方法: public ArrayDeque() { elements = new Object[16]; } public ArrayDeque...如果你需要用到双向嘟列,那么 ArrayDeque 相对于 LinkedList 要更好。...因为 ArrayDeque 相对于 LinkedList 直接采用数组存储,而 LinkedList 则需要采用节点存储。所以 LinkedList 相对于 ArrayDeque 需要消耗更多内存。...而查阅 ArrayDeque 和 LinkedList 的发布时间,我们会发现 ArrayDeque 发布于 JDK 1.6,而 LinkedList 发布于 JDK 1.2。...如果你对 LinkedList 和 ArrayDeque 的差异感兴趣,建议阅读这篇文章:Java: ArrayDeque vs. LinkedList
一,ArrayDeque源码分析 1.1,ArrayDeque是什么?...首先ArraryDeque是队列的一种,队列的特点就是先进先出嘛,类似超市购物付款时的场景,当然了,现在市面上比较常见的分布式组件,基于amqp协议的消息队列都是队列的变形,那么ArrayDeque是一个双端队列...二, 方法分析 2.1,构造函数 public ArrayDeque() { //默认构建一个容量为16大小的对象数组,赋值给成员变量elements //我们也可以指定容量大小
到这里整个ArrayDeque双端队列的源码分析就结束了,自己就是将大部分常用的方法进行了分析,其它没有分析的方法,需要的你可以看下,这里就不过多说明了,分析一篇文章确实耗时很长,可能你看这篇文章也就几分钟
ArrayDeque双端队列完全解析 重点: 底层通过循环数组实现 俩个重要属性 head tail 不能添加null值,不然会报空指针 每次扩容都是2的n次方 可以实现普通队列先进先出排序,也可以实现栈先进后出的排序...是通过数组实现队列功能 的;而且具有对数组头尾双端添加和移除对象的功能,但如果数组不能实现循环功能,会出现以下情况 图一 在构建一个ArrayDeque对象时,会初始化head和tail的值为0.当有对象加入数组时...另外,ArrayDeque提供了可以指定数组容量的构造器,那我输入非2的n次方数值,内部会发生什么?...---- ArrayDeque 既可实现普通队列 FIFO 先进先出,也可实现栈的先进后出功能 其实也好理解,因为ArrayDeque实现了双端的操作 所以使得这一切都成为了可能 先进先出 addFirst...Java进阶–ArrayDeque双端队列完全解析 End!
(2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗?...ArrayDeque是一种以数组方式实现的双端队列,它是非线程安全的。 继承体系 ?...主要构造方法 // 默认构造方法,初始容量为16public ArrayDeque() { elements = new Object[16];}// 指定元素个数初始化public ArrayDeque...总结 (1)ArrayDeque是采用数组方式实现的双端队列; (2)ArrayDeque的出队入队是通过头尾指针循环利用数组实现的; (3)ArrayDeque容量不足时是会扩容的,每次扩容容量增加一倍...; (4)ArrayDeque可以直接作为栈使用; 彩蛋 双端队列与双重队列?
ArrayDeque 的特点 2.1 说一下 ArrayDeque 的特点 1、ArrayDeque 是基于动态数组实现的 Deque 双端队列,内部封装了扩容和数据搬运的逻辑; 2、ArrayDeque...的数组容量保证是 2 的整数幂; 3、ArrayDeque 不是线程安全的; 4、ArrayDeque 不支持 null 元素; 5、ArrayDeque 虽然入栈和入队有可能会触发扩容,但从均摊分析上看依然是...ArrayDeque 源码分析 这一节,我们来分析 ArrayDeque 中主要流程的源码。...4.1 ArrayDeque 的属性 ArrayDeque 底层是一个 Object 数组; ArrayDeque 用 head 和 tail 指针指向数组的 “队头位置” 和 “队尾位置”,需要注意...因为 ArrayDeque 禁止存储 null 元素,所以需要逐个判断元素是否为 null 值后才添加。 ♀️疑问 6:为什么 ArrayDeque 要求数组容量是 2 的整数幂?
我们首先来看ArrayDeque的用法,然后来分析其实现原理,最后总结分析其特点。...ArrayDeque有如下构造方法: public ArrayDeque() public ArrayDeque(int numElements) public ArrayDeque(Collection...ArrayDeque可以看做一个先进先出的队列,比如: Queue queue = new ArrayDeque(); queue.offer("a"); queue.offer(...看最后一个构造方法: public ArrayDeque(Collection<?...ArrayDeque特点分析 ArrayDeque实现了双端队列,内部使用循环数组实现,这决定了它有如下特点: 在两端添加、删除元素的效率很高,动态扩展需要的内存分配以及数组拷贝开销可以被平摊,具体来说
参考链接: Java ArrayDeque java 方法 示例 ArrayDeque类peekLast()方法 (ArrayDeque Class peekLast() method) peekLast...Example: 例: // Java program to demonstrate the example // of T peekLast() method of ArrayDeque...public class PeekLastOfArrayDeque { public static void main(String[] args) { // Creating an ArrayDeque...with initial capacity of // storing elements Deque d_queue = new ArrayDeque... (10); // By using add() method to add elements // in ArrayDeque d_queue.add
ArrayDeque介绍 ---- ArrayDeque是一个实现了Deque接口,并且可调整大小的一个双向队列。ArrayDeque队列没有容量限制,它可以根据需要扩容。...ArrayDeque底层采用数组实现的。 ArrayDeque特性: ArrayDeque是一个可扩容的双端队列。 内部使用数组存储数据。 ArrayDeque不是线程安全的。...ArrayDeque禁止使用空元素。 ArrayDeque用作堆栈时,比Stack要快,当它用作队列时,比LinkedList要快。 ArrayDeque最大容量是2^30个元素。...ArrayDeque解析 ---- 首先我们来看ArrayDeque的构建。 ArrayDeque队列的容量必须满足2的n次幂,它是如何保证的呢?...ArrayDeque的容量大小是可以动态调整的,并且容量大小必须满足是2的n次幂。 ArrayDeque内部是使用数组来实现数据存储的。 ArrayDeque不是线程安全的。
二、双端队列实现类ArrayDeque ArrayDeque中主要有以下几个属性域: transient Object[] elements; transient int head; transient...现在我们看下它的几个构造函数: public ArrayDeque() { elements = new Object[16]; } public ArrayDeque(int numElements...入队操作 由于ArrayDeque实现了Deque,所以它是一个双向队列,支持从头部或者尾部添加节点,由于内部操作类似,我们只简单介绍从尾部添加入队操作。...其实,虽然我们这个ArrayDeque它实现了双端队列,并且我们本篇主要把他当做队列来研究,其实该类完全可以作为栈或者一些其他结构来使用,所以提供了一些其他的方法,但本质上还是某几个方法。...至此,有关ArrayDeque的简单原理已经介该绍完了,ArrayDeque的主要优势在于尾部添加元素,头部出队元素的效率是比较高的,内部使用位操作来判断队满条件,效率相对有所提高,并且该结构使用动态扩容
领取专属 10元无门槛券
手把手带您无忧上云