您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java集合Queue-ArrayDeque有什么作用
## 一、ArrayDeque概述
`ArrayDeque`是Java集合框架中一个重要的双端队列(Deque)实现,自Java 6引入。它基于**循环数组**数据结构实现,既可作为先进先出(FIFO)的队列使用,也可作为后进先出(LIFO)的栈使用。
### 核心特性
- **动态扩容**:初始容量16,按需自动扩容为2的幂次方
- **非线程安全**:需外部同步保证线程安全
- **Null值禁止**:禁止插入null元素
- **高性能**:O(1)时间复杂度的头尾操作
## 二、核心应用场景
### 1. 替代传统Stack实现
```java
// 作为栈使用(推荐替代Stack类)
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); // 入栈
stack.pop(); // 出栈
优势对比:
特性 | ArrayDeque | Stack |
---|---|---|
同步开销 | 无 | 有 |
扩容效率 | 更高 | 较低 |
迭代顺序 | LIFO | LIFO |
// 作为队列使用(替代LinkedList)
Queue<String> queue = new ArrayDeque<>();
queue.offer("A"); // 入队
queue.poll(); // 出队
性能对比(百万次操作): - 入队操作:ArrayDeque比LinkedList快约30% - 内存占用:ArrayDeque节省约40%内存
// 实现滑动窗口最大值(LeetCode 239)
public int[] maxSlidingWindow(int[] nums, int k) {
ArrayDeque<Integer> deque = new ArrayDeque<>();
int[] res = new int[nums.length - k + 1];
// ... 具体实现逻辑
}
transient Object[] elements; // 存储元素的数组
transient int head; // 头指针
transient int tail; // 尾指针
// 计算下一个插入位置
tail = (tail + 1) & (elements.length - 1) // 利用位运算代替取模
private void doubleCapacity() {
int newCapacity = elements.length << 1; // 双倍扩容
Object[] a = new Object[newCapacity];
// 分两段复制元素
System.arraycopy(elements, head, a, 0, elements.length - head);
System.arraycopy(elements, 0, a, elements.length - head, head);
}
初始化容量:预估最大元素数量,避免频繁扩容
new ArrayDeque<>(100); // 指定初始容量
批量操作:优先使用addAll/removeAll方法
遍历优化:
// 使用迭代器比for-each更高效
Iterator<String> it = deque.iterator();
while(it.hasNext()) {
String item = it.next();
}
特性 | ArrayDeque | LinkedList | PriorityQueue |
---|---|---|---|
数据结构 | 循环数组 | 双向链表 | 堆 |
插入删除时间复杂度 | O(1) | O(1) | O(log n) |
随机访问 | 不支持 | O(n) | 不支持 |
内存连续性 | 好 | 差 | 一般 |
适用场景 | 高频头尾操作 | 频繁中间操作 | 优先级处理 |
// 实现简单的任务队列
ArrayDeque<Runnable> taskQueue = new ArrayDeque<>();
// 生产者线程
taskQueue.offer(() -> System.out.println("Task1"));
// 消费者线程
Runnable task = taskQueue.poll();
if(task != null) task.run();
// 实现文档编辑的撤销/重做功能
ArrayDeque<Action> undoStack = new ArrayDeque<>();
ArrayDeque<Action> redoStack = new ArrayDeque<>();
void performAction(Action action) {
action.execute();
undoStack.push(action);
redoStack.clear();
}
ArrayDeque作为Java集合框架中的高效双端队列实现,在需要频繁进行队列头尾操作的场景下展现出显著优势。其设计巧妙结合了数组的随机访问特性和循环数组的空间复用机制,是替代传统Stack和LinkedList的理想选择。开发者应根据具体业务场景,合理选择初始化参数和使用模式,以充分发挥其性能优势。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。