一、类图关系

二、要点分析

1.  ArrayDeque 不允许空元素 null

2.  当用作栈时,比 Stack 快,当用作队列时,比 LinkedList 快

     一是因为它基于循环数组(只需操作索引),二是没有使用 Synchronized 修饰方法(非线程安全)

This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.

3.  迭代器 fail-fast

4.  容量是 2 的整数次幂,最小(初始)容量是 8,构造函数可以指定容量,自动修正为 2 的整数次幂大小

默认容量是16

private void allocateElements(int numElements) {
        int initialCapacity = MIN_INITIAL_CAPACITY;
        // Find the best power of two to hold elements.
        // Tests "<=" because arrays aren't kept full.
        if (numElements >= initialCapacity) {
            initialCapacity = numElements;
            initialCapacity |= (initialCapacity >>>  1);
            initialCapacity |= (initialCapacity >>>  2);
            initialCapacity |= (initialCapacity >>>  4);
            initialCapacity |= (initialCapacity >>>  8);
            initialCapacity |= (initialCapacity >>> 16);
            initialCapacity++;

if (initialCapacity < 0)   // Too many elements, must back off
                initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
        }
        elements = new Object[initialCapacity];
    }

// 解释说明

简单分析一下代码的运算过程,注:">>>"代表按位右移 (空位 0 补齐):
假设a=1xxxxxxxxxxxx...(base 2, x代表该位任意为0或1)
首先a |= (a >>> 1)之后,a => 11xxxxxxxx...(最高两位是1)
然后a |= (a>>> 2): a => 1111xxxxxxxxx...(最高四位是1)
再a |= (a>>> 4): a => 11111111xxxxxxx...(最高八位是1)
........
最终,a的所有低位也都变成了1,即11111111...111(全是1)
再a++ 就变成了10000000000...000(加一之后进位,比原来的二进制串多了一位,且第一位是1,其它位都是0),这个算法不仅时间效率高,而且只用到了一个变量,真可谓是短小精悍,在HashMap里也可以看到这个算法的身影。

5.   容量占满时,使用翻倍策略扩容,内部是个数组(循环数组)

private void doubleCapacity() {
        assert head == tail;
        int p = head;
        int n = elements.length;
        int r = n - p; // number of elements to the right of p
        int newCapacity = n << 1;
        if (newCapacity < 0)
            throw new IllegalStateException("Sorry, deque too big");
        Object[] a = new Object[newCapacity];
        System.arraycopy(elements, p, a, 0, r);
        System.arraycopy(elements, 0, a, r, p); // 理解这两句,请看下图

        elements = a;
        head = 0;
        tail = n;
    }

注意: head 指向实际存有数据的头节点,tail 指向下一个应该放数据的尾节点

6.   取下标操作使用位运算,例如

public E pollFirst() {
        int h = head;
        @SuppressWarnings("unchecked")
        E result = (E) elements[h];
        // Element is null if deque empty
        if (result == null)
            return null;
        elements[h] = null;     // Must null out slot
        head = (h + 1) & (elements.length - 1);
        return result;
    }

7.  含逆向迭代方法 descendingIterator

ArrayDeque相关推荐

  1. List 系列 ArrayList LinkedList CopyOnWriteArrayList Queue系列 ArrayDeque ConcurrentLinkedDeque LinkedBlo

    LinkedBlockingDeque作为一种阻塞双端队列,提供了队尾删除元素和队首插入元素的阻塞方法.该类在构造时一般需要指定容量,如果不指定,则最大容量为Integer.MAX_VALUE.另外, ...

  2. 死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...

  3. java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析

    栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...

  4. 033_使用ArrayDeque模拟队列结构

    import java.util.ArrayDeque; import java.util.Iterator;/*** 使用ArrayDeque模拟队列结构*/ public class QueueU ...

  5. 032_使用ArrayDeque模拟栈结构

    import java.util.ArrayDeque; import java.util.Iterator;/*** 使用ArrayDeque模拟栈结构*/ public class DequeSt ...

  6. ArrayDeque中的取余

    Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字).而当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque:既然Queue只是一个接口, ...

  7. Java ArrayDeque

    介绍: Java中的ArrayDeque是实现Deque接口的类. 它是双端队列的基于数组的实现. 顾名思义,双端队列是允许我们在前端和后端添加或删除项目的队列. 在开始之前,让我们快速看一下Arra ...

  8. java 方法 示例_Java ArrayDeque pollFirst()方法与示例

    java 方法 示例 ArrayDeque类pollFirst()方法 (ArrayDeque Class pollFirst() method) pollFirst() Method is avai ...

  9. java 方法 示例_Java ArrayDeque offerFirst()方法与示例

    java 方法 示例 ArrayDeque类offerFirst()方法 (ArrayDeque Class offerFirst() method) offerFirst() Method is a ...

  10. sheets.add示例_Java ArrayDeque add()方法与示例

    sheets.add示例 ArrayDeque类add()方法 (ArrayDeque Class add() method) add() Method is available in java.la ...

最新文章

  1. datatables如何把列设置成hidden隐藏域?
  2. docker ps 列出容器 命令简介
  3. js中期BOM及this指向
  4. 在 Java OOP 编程中的注意事项
  5. linux if 判断文件数量,linux if判断命令
  6. springboot + vue 拦截器重定向_springboot学习笔记
  7. python入门教程(非常详细)-Python入门教程:超详细1小时学会Python
  8. ORACLE11g R2数据库安装(一)
  9. 总结:常用的 Python 爬虫技巧
  10. MongoDB可视化工具Robomongo 和 Mongochef
  11. 《西游记》中的未解之谜,经典之至
  12. [转]一淘网是如何实现系统架构的
  13. 微信每天加多少人不会封号?(行业经验)
  14. Linux查询系统上次启动时间last reboot、上线时间uptime
  15. base64加密解密
  16. 2023最新仿蓝奏云合集下载页面系统源码+有PHP后台版的
  17. Python爬取网易云音乐热歌排行榜Top200音乐
  18. aac格式怎么转换为MP3格式
  19. IP65等IP防尘防水等级测试标准IEC60529测试内容详解
  20. ftp服务器上文件移动失败(ftpClient.rename返回false)

热门文章

  1. Rides持久化机制
  2. [运动规划算法]基于飞行走廊的轨迹优化
  3. opensslErrorStack: [ ‘error:03000086:digital envelope routines::initialization error‘ ]
  4. 高速场景下自动驾驶车辆定位方法综述
  5. 【阅读整理】An Accurate Skeleton ExtractionApproach From 3D Point Clouds of Maize Plants
  6. thymeleaf取值域名加不加#的区别
  7. 详解MySQL事务原理
  8. 钉钉的密聊消息会保存在服务器吗,钉钉密聊怎么保护客户的隐私?
  9. 品效协同,国货新秀colorkey珂拉琪的户外广告制胜秘籍
  10. leetcode 86