2026-01-21 07:22:39
双端队列(Deque)是Java集合框架中一种特殊的线性数据结构,允许在队列的两端进行插入和删除操作。它扩展了Queue接口,因此可以当作队列(FIFO)或栈(LIFO)使用,提供了更灵活的操作方式。
Deque接口的核心方法:
插入操作:
addFirst(e) / offerFirst(e):在队首插入元素,失败时分别抛出异常或返回false。
addLast(e) / offerLast(e):在队尾插入元素,行为同上。
删除操作:
removeFirst() / pollFirst():移除并返回队首元素,失败时分别抛出异常或返回null。
removeLast() / pollLast():移除并返回队尾元素,行为同上。
检查操作:
getFirst() / peekFirst():返回但不移除队首元素,失败时分别抛出异常或返回null。
getLast() / peekLast():返回但不移除队尾元素,行为同上。
Deque作为队列使用:
当Deque作为队列时,遵循FIFO原则,元素从队尾添加,从队首移除。
Queue接口的方法与Deque方法等效,例如add(e)对应addLast(e),remove()对应removeFirst()。
Deque作为栈使用:
Deque也可以当作栈使用,遵循LIFO原则。
栈的push和pop操作分别对应Deque的addFirst(e)和removeFirst()。
推荐使用Deque接口而非旧的Stack类,因为Deque提供了更一致和高效的操作。
其他特性:
Deque接口提供了removeFirstOccurrence和removeLastOccurrence方法,用于移除指定元素的第一次或最后一次出现。
与List接口不同,Deque不支持基于索引的访问。
尽管Deque实现可能允许插入null元素,但强烈建议避免这样做,因为null被用作特殊返回值来指示Deque为空。
Deque实现通常不重写equals和hashCode方法,而是继承自Object类的基于标识的版本。
实现类:
Java提供了多种Deque的实现,如ArrayDeque和LinkedList。ArrayDeque基于可调整大小的数组,而LinkedList则基于链表结构。
应用场景:
Deque适用于需要频繁在两端进行插入和删除操作的场景,如滑动窗口问题、撤销操作栈等。
通过理解和掌握Deque接口及其方法,开发者可以更加灵活地处理各种数据结构问题,提高代码的效率和可读性。