Java面试重点_7. Queue, Deque, 及ArrayDeque 源码分析和对比
文章目录
一, Queue

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


1.1 Queue的主要方法

二, 超级实现类AbstractQueue

二, Deque

2.1 双端队列的特有方法

2.2 Dequeue与Queue, 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 底层基于可动态扩容的循环数组实现,既可以作为队列使用,又可以作为栈来使用。
- ArrayDeque
作为栈的时候,经常会将它与 Stack 做对比,Stack 也是一个可以作为栈使用的类,但是 Java 已不推荐使用它,如果要使用栈,推荐使用更高效的 ArrayDeque。
作为队列的时候,ArrayDeque 和 LinkedList 都是 Deque 接口的实现类,两者差别在于底层数据结构的不同,LinkedList 底层基于循环链表实现,结点因为存储前后指针域的原因, 内存开销高于 ArrayDeque,在小数据量的时候,两者效率差别不大;在大数据量的时候,ArrayDeque 性能高于 LinkedList,推荐使用 ArrayDeque 类。
前后指针域的原因, 内存开销高于 ArrayDeque,在小数据量的时候,两者效率差别不大;在大数据量的时候,ArrayDeque 性能高于 LinkedList,推荐使用 ArrayDeque 类。
- 还有一个不同的地方是,ArrayDeque 不允许插入null,而 LinkedList 允许插入null;同时,两者都是非线程安全的,如果在多线程环境下,建议使用 Java 并发工具包里面的操作类。
- 参考文章:
- http://www.justdojava.com/2019/11/27/java-collection-12/
- https://www.jianshu.com/p/1c1c3f24762e

浙公网安备 33010602011771号