Java 双向队列 Deque

本文详细解读了如何使用ArrayDeque和ConcurrentLinkedDeque实现双向队列的基本操作,包括插入、删除、获取等,并讨论了它们在并发环境下的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队头队尾
没有就出异常 or null没有就出异常 or null
insertaddFirst(e) or offerFirst(e)addLast(e) or offerLast(e)
removeremoveFirst() or pollFirst()removeLast() or pollLast()
出但不删除getFirst() or peekFirst()getLast() or peekLast()

实现了双向队列的:
ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList
(一般用加粗的这两)

### Java 中实现双向队列的类 `Deque` 在 Java 的标准库中,`Deque` 是一个接口,表示双端队列(Double-ended Queue),允许从队列的两端插入和删除元素。它不仅支持队列的操作,还兼容栈的功能[^4]。 #### 常见的 `Deque` 接口实现类 1. **`ArrayDeque`** - `ArrayDeque` 是基于数组实现的双端队列,具有高效的性能表现。 - 它不会抛出容量溢出异常,而是动态扩展底层存储空间来适应更多的数据项。 - 不适合频繁修改大小的情况,因为每次扩容都会涉及一定的开销。 - 方法调用效率高,适用于大多数场景下的双端队列需求[^1]。 2. **`LinkedList`** - 虽然 `LinkedList` 主要被设计为链表结构的数据容器,但它同时也实现了 `Deque` 接口。 - 由于其内部采用双向链表结构,因此不需要考虑像 `ArrayDeque` 那样的固定容量或越界问题。 - 插入、删除操作的时间复杂度均为 O(1),非常适合用于需要频繁增删节点的应用场合[^3]。 以下是两个主要实现类的关键区别总结: | 特性/实现 | ArrayDeque | LinkedList | |-------------------|-------------------------------------|------------------------------------| | 底层数据结构 | 数组 | 双向链表 | | 是否线程安全 | 否 | 否 | | 扩展能力 | 自动调整大小 | 动态增长 | | 性能 | 较高的随机访问速度 | 更优的插入与删除性能 | #### 使用示例 下面分别展示了如何利用这两种方式创建并操作 `Deque` 对象。 ##### 使用 `ArrayDeque` ```java import java.util.ArrayDeque; import java.util.Deque; public class ArrayDequeExample { public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<>(); // 添加元素到尾部 deque.offerLast(1); deque.addLast(2); // 查看第一个元素而不移除 System.out.println(deque.peekFirst()); // 移除最后一个元素 Integer removedElement = deque.pollLast(); System.out.println("Removed Element: " + removedElement); } } ``` ##### 使用 `LinkedList` ```java import java.util.LinkedList; import java.util.Deque; public class LinkedListAsDequeExample { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); // 将字符串加入deque.push("first"); deque.offerFirst("second"); // 获取但不移除最前面的一个项目 String firstItem = deque.getFirst(); System.out.println(firstItem); // 删除堆顶元素 (即最后压入的那个) String poppedValue = deque.pop(); System.out.println(poppedValue); } } ``` 以上代码片段演示了两种不同类型的 `Deque` 实现及其基本功能应用实例[^2][^3]。 ### 注意事项 - 如果仅需简单的 FIFO 或 LIFO 行为而无需额外特性的话,优先选用轻量级且高效运行时特性的 `ArrayDeque`. - 当涉及到更复杂的集合管理或者希望获得更加灵活的行为模式时,则可以选择更为通用但也稍显重量级一点的解决方案——`LinkedList`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值