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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)