Deque(双端队列)是 Java 中的一个接口,属于 java.util 包。它继承自 Queue 接口,提供了在双端队列的两端插入和删除元素的能力。这意味着它可以作为栈(后进先出,LIFO)或队列(先进先出,FIFO)使用。
Java 中的 Deque 接口有多种实现,最常见的是 ArrayDeque 和 LinkedList:
ArrayDeque: 使用可调整大小的数组实现的双端队列。它比 LinkedList 更快,用作栈或没有大小限制的队列时更有效。不支持存储 null 元素。
LinkedList: 既是 List 实现又是 Deque 实现。相比于 ArrayDeque,LinkedList 的元素插入和删除操作可能稍慢,但在列表中间插入和删除元素时较快。支持存储 null 元素。
添加元素:
addFirst(E e): 在双端队列的前端添加一个元素。
addLast(E e): 在双端队列的末尾添加一个元素。
offerFirst(E e): 在双端队列的前端插入一个元素,返回是否成功。
offerLast(E e): 在双端队列的末尾插入一个元素,返回是否成功。
删除元素:
removeFirst(): 移除并返回双端队列的第一个元素。
removeLast(): 移除并返回双端队列的最后一个元素。
pollFirst(): 移除并返回双端队列的第一个元素,如果队列为空则返回 null。
pollLast(): 移除并返回双端队列的最后一个元素,如果队列为空则返回 null。
检查元素:
getFirst(): 返回双端队列的第一个元素。
getLast(): 返回双端队列的最后一个元素。
peekFirst(): 返回双端队列的第一个元素,如果队列为空则返回 null。
peekLast(): 返回双端队列的最后一个元素,如果队列为空则返回 null。
作为栈使用: 使用 addFirst() 或 push() 添加元素,使用 removeFirst() 或 pop() 删除元素。
作为队列使用: 使用 addLast() 或 offer() 添加元素,使用 removeFirst() 或 poll() 删除元素。
容量限制: ArrayDeque 有初始化大小,但可以动态扩展。注意大量元素插入时可能导致内存重新分配。
Null 值: ArrayDeque 不允许插入 null 元素。尝试添加或检查 null 元素会抛出 NullPointerException。
线程安全: Deque 实现不是线程安全的。如果在多线程环境中使用,需要外部同步或使用 ConcurrentLinkedDeque。
性能: 使用正确的实现(ArrayDeque vs LinkedList)可以提高性能。一般而言,除非需要列表操作,否则优先考虑 ArrayDeque。
迭代器: Deque 迭代器通常从双端队列的头部开始遍历到尾部。但也可以使用 descendingIterator() 以相反的顺序遍历。
通过理解和遵循这些基本准则,可以更有效地使用 Java 中的 Deque 接口及其实现。