ArrayDeque简介
下文笔者讲述"ArrayDeque简介"说明,如下所示
ArrayDeque简介
`ArrayDeque`是Java中的一个双端队列(Double-ended Queue)实现
它允许在队列的两端进行元素的插入和删除操作
`ArrayDeque`是`Deque`接口的一个具体实现,不是线程安全的。
ArrayDeque主要特点
1.基本特性
-动态数组实现:
底层使用循环数组实现
-无容量限制:
可以根据需要动态扩容
-非线程安全:
不提供并发访问保护
-不允许null元素:
插入null会抛出 NullPointerException
-高效性能:
大多数操作的时间复杂度为 O(1)
2.与Linkedlist比较
// ArrayDeque vs LinkedList 作为 Deque 使用
public class DequeComparison {
public void comparePerformance() {
// ArrayDeque - 基于数组,内存局部性好
Deque<String> arrayDeque = new ArrayDeque<>();
// LinkedList - 基于链表,每个节点需要额外内存
Deque<String> linkedList = new LinkedList<>();
// ArrayDeque 在大多数操作上性能更好
}
}
ArrayDeque示例
1.作为普通队列使用(FIFO)
import java.util.ArrayDeque;
import java.util.Deque;
public class QueueExample {
public void queueOperations() {
Deque<String> queue = new ArrayDeque<>();
// 入队操作
queue.offer("first");
queue.offer("second");
queue.offer("third");
// 查看队首元素(不移除)
System.out.println("队首元素: " + queue.peek()); // 输出: first
// 出队操作
System.out.println("出队: " + queue.poll()); // 输出: first
System.out.println("出队: " + queue.poll()); // 输出: second
System.out.println("剩余元素数量: " + queue.size()); // 输出: 1
}
}
2. 作为栈使用(LIFO)
public class StackExample {
public void stackOperations() {
Deque<String> stack = new ArrayDeque<>();
// 入栈操作
stack.push("first");
stack.push("second");
stack.push("third");
// 查看栈顶元素(不移除)
System.out.println("栈顶元素: " + stack.peek()); // 输出: third
// 出栈操作
System.out.println("出栈: " + stack.pop()); // 输出: third
System.out.println("出栈: " + stack.pop()); // 输出: second
System.out.println("剩余元素数量: " + stack.size()); // 输出: 1
}
}
3.双端操作
public class DequeOperations {
public void dequeOperations() {
ArrayDeque<String> deque = new ArrayDeque<>();
// 从队尾添加
deque.addLast("tail");
deque.offerLast("tail2");
// 从队首添加
deque.addFirst("head");
deque.offerFirst("head2");
System.out.println("deque: " + deque); // [head2, head, tail, tail2]
// 从队首移除
System.out.println("移除队首: " + deque.removeFirst()); // head2
System.out.println("移除队首: " + deque.pollFirst()); // head
// 从队尾移除
System.out.println("移除队尾: " + deque.removeLast()); // tail2
System.out.println("移除队尾: " + deque.pollLast()); // tail
}
}
ArrayDeque内部实现原理
1. 循环数组结构
public class ArrayDequeInternal {
// 简化的内部结构示意
private Object[] elements; // 存储元素的数组
private int head; // 队首索引
private int tail; // 队尾索引
// 当 head == tail 时,队列为空
// 当 (tail + 1) % elements.length == head 时,队列满(预留一个空位)
}
2. 扩容机制
public class ResizeExample {
public void demonstrateResize() {
ArrayDeque<Integer> deque = new ArrayDeque<>(4); // 初始容量4
// 添加元素触发扩容
for (int i = 0; i < 10; i++) {
deque.add(i);
}
// ArrayDeque 扩容时容量变为原来的2倍
System.out.println("元素数量: " + deque.size()); // 10
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


