ArrayDeque是Java 集合框架中的一个类,它是一个基于可调整大小的循环数组实现的双端队列
是Deque接口的实现类之一
继承关系:
Iterable (接口) ↓ Collection (接口) ↓ Queue (接口) ↓ Deque (接口) ↓ ┌─────────────────┐ │ ArrayDeque (类) │ ← 具体实现 └─────────────────┘主要特点:
1.数据结构
底层使用动态数组(循环数组)实现
允许从两端高效地添加/移除元素
内存连续,访问速度快
2.核心特性
线程不安全(非同步)
不允许存储 null 元素
初始容量默认为16,自动扩容(2倍)
既可作为栈(Stack)使用,也可作为队列(Queue)使用
性能通常优于 LinkedList(作为队列/栈时)
常用方法:
队列操作(FIFO)
ArrayDeque<String> deque = new ArrayDeque<>(); // 添加元素到队尾 deque.offer("A"); // 推荐 deque.add("B"); // 可能抛出异常 deque.offerLast("C"); // 明确指定队尾 // 从队首移除并返回 String first = deque.poll(); // 返回null如果为空 String first2 = deque.remove(); // 抛出异常如果为空 String first3 = deque.pollFirst(); // 查看队首(不移除) String peek = deque.peek(); String peek2 = deque.peekFirst();栈操作(LIFO)
// 作为栈使用 ArrayDeque<String> stack = new ArrayDeque<>(); // 压栈 stack.push("A"); // 添加到队首 stack.addFirst("B"); // 弹栈 String top = stack.pop(); // 移除队首 String top2 = stack.pollFirst(); // 查看栈顶 String peek = stack.peek(); String peek2 = stack.peekFirst();双端队列操作
// 队首操作 deque.addFirst("First"); deque.offerFirst("First"); deque.removeFirst(); deque.pollFirst(); // 队尾操作 deque.addLast("Last"); deque.offerLast("Last"); deque.removeLast(); deque.pollLast();性能对比
| 操作 | ArrayDeque | LinkedList |
|---|---|---|
| 添加/删除(两端) | O(1)* | O(1) |
| 随机访问 | O(1) | O(n) |
| 内存使用 | 更紧凑 | 更多(节点开销) |
| 遍历速度 | 更快(缓存友好) | 较慢 |
注意:ArrayDeque的O(1)是分摊时间复杂度,扩容时会有额外开销
使用场景推荐:
推荐使用 ArrayDeque:
作为栈使用(替代过时的 Stack 类)
// 推荐 Deque<Integer> stack = new ArrayDeque<>(); // 不推荐(已过时) Stack<Integer> oldStack = new Stack<>();作为队列使用
Queue<String> queue = new ArrayDeque<>();需要高效的双端操作
Deque<Integer> deque = new ArrayDeque<>();
不适合的场景:
需要线程安全(考虑使用 ConcurrentLinkedDeque)
需要存储 null 元素
需要频繁在中间插入/删除
示例代码:
public class ArrayDequeExample { public static void main(String[] args) { // 1. 作为队列 Queue<Integer> queue = new ArrayDeque<>(); queue.offer(1); queue.offer(2); System.out.println(queue.poll()); // 1 // 2. 作为栈 Deque<Integer> stack = new ArrayDeque<>(); stack.push(1); stack.push(2); System.out.println(stack.pop()); // 2 // 3. 作为双端队列 ArrayDeque<String> deque = new ArrayDeque<>(); deque.addFirst("First"); deque.addLast("Last"); System.out.println(deque); // [First, Last] } }注意事项:
线程安全:ArrayDeque 不是线程安全的,多线程环境下需要外部同步
容量限制:最大容量是
Integer.MAX_VALUE - 8迭代器:迭代器是 fail-fast 的
性能:在大多数场景下,作为栈/队列使用时性能优于 LinkedList
总结:ArrayDeque 是 Java 中实现队列和栈的首选类,它提供了高效的性能、简洁的API,并且比传统的Stack类更现代、更安全。