Java面试重点_7. Queue, Deque, 及ArrayDeque 源码分析和对比

一, Queue

在这里插入图片描述

  1. Queue是一种很常见的数据结构类型,在Java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约。
  2. 实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现。还有的适用于多线程的环境。
  3. java中具有Queue功能的类主要有如下几个:AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList, PriorityBlockingQueue, PriorityQueue和ArrayDqueue。

在这里插入图片描述
在这里插入图片描述

1.1 Queue的主要方法

在这里插入图片描述

二, 超级实现类AbstractQueue

在这里插入图片描述

二, Deque

在这里插入图片描述

2.1 双端队列的特有方法

在这里插入图片描述

2.2 Dequeue与Queue, Stack的 对应方法

在这里插入图片描述

Java中的Deque和Stack的内部原理区别

三, ArrayDeque

在这里插入图片描述

faster than Stack when used as a stack, and faster than LinkedList when used as a queue.

3.1 构造函数及其重要成员变量

在这里插入图片描述

3.2 寻找最近的2次幂

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3 重要操作方法 (△)

3.3.1 add() 分析

Deque主要定义了一些关于First和Last的操作,如add、remove、get等。我们看看它是如何实现的吧。

//在队首添加一个元素,非空
public void addFirst(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[head = (head - 1) & (elements.length - 1)] = e;
    if (head == tail)
        doubleCapacity();
}

//在队尾添加一个元素,非空
public void addLast(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[tail] = e;
    if ( (tail = (tail + 1) & (elements.length - 1)) == head)
        doubleCapacity();
}

在这里插入图片描述

3.3.2 Occurrence相关

在这里插入图片描述

四, 总结

在这里插入图片描述


ArrayDeque 底层基于可动态扩容的循环数组实现,既可以作为队列使用,又可以作为栈来使用。

  1. ArrayDeque 作为栈的时候,经常会将它与 Stack 做对比,Stack 也是一个可以作为栈使用的类,但是 Java 已不推荐使用它,如果要使用栈,推荐使用更高效的 ArrayDeque。
  1. 作为队列的时候,ArrayDeque 和 LinkedList 都是 Deque 接口的实现类,两者差别在于底层数据结构的不同,LinkedList 底层基于循环链表实现,结点因为存储前后指针域的原因, 内存开销高于 ArrayDeque,在小数据量的时候,两者效率差别不大;在大数据量的时候,ArrayDeque 性能高于 LinkedList,推荐使用 ArrayDeque 类。
    前后指针域的原因, 内存开销高于 ArrayDeque,在小数据量的时候,两者效率差别不大;在大数据量的时候,ArrayDeque 性能高于 LinkedList,推荐使用 ArrayDeque 类。
  1. 还有一个不同的地方是,ArrayDeque 不允许插入null,而 LinkedList 允许插入null;同时,两者都是非线程安全的,如果在多线程环境下,建议使用 Java 并发工具包里面的操作类。
  • 参考文章:
    • http://www.justdojava.com/2019/11/27/java-collection-12/
    • https://www.jianshu.com/p/1c1c3f24762e
posted @   青松城  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示