在现代软件开发中,数据结构是构建高效、可维护代码的基础。
Java 作为一门广泛应用的编程语言,其丰富的集合框架(Collections Framework)为开发者提供了多种强大的数据结构,其中 Queue(队列)和 Deque(双端队列)尤为常见。本文将深入探讨 Java 中的 Queue 和 Deque,帮助你更好地理解和使用它们来解决实际问题。
队列和双端队列在日常编程中的应用场景非常广泛。无论是任务调度、缓存系统,还是处理广度优先搜索(BFS)算法,队列都能大显身手。而双端队列则进一步扩展了队列的功能,使得数据可以从两端插入和删除,增加了数据处理的灵活性。
本文将从概念、接口方法和具体实现三个方面,详细介绍 Queue 和 Deque 的基本原理及其在 Java 中的具体应用。通过对比这两种数据结构的异同,希望读者能够更好地选择和使用它们,提高程序的性能和可读性。
接下来,让我们首先了解 Queue 的基本概念及其在 Java 中的实现。
boolean add(E e): 将元素添加到队列尾部,如果成功返回 true,如果失败(例如容量限制)抛出异常。boolean offer(E e): 将元素添加到队列尾部,如果成功返回 true,如果失败返回 false。E remove(): 移除并返回队列头部的元素,如果队列为空抛出异常。E poll(): 移除并返回队列头部的元素,如果队列为空返回 null。E element(): 返回队列头部的元素,但不移除它,如果队列为空抛出异常。E peek(): 返回队列头部的元素,但不移除它,如果队列为空返回 null。LinkedListPriorityQueueArrayDequeConcurrentLinkedQueueLinkedBlockingQueueArrayBlockingQueueimport java.util.Deque; import java.util.ArrayDeque; public class QueueUsingDequeDemo { public static void main(String[] args) { // 创建一个ArrayDeque实例,当作单向队列使用 Deque queue = new ArrayDeque<>(); // 入队操作:在队列尾部添加元素 queue.offer("苹果"); queue.offer("香蕉"); queue.offer("樱桃"); System.out.println("当前队列: " + queue); // 出队操作:从队列头部移除并获取元素 String firstFruit = queue.poll(); if (firstFruit != null) { System.out.println("出队元素: " + firstFruit); System.out.println("出队后队列: " + queue); } else { System.out.println("队列为空,无法出队。"); } // 检查队列是否为空 boolean isEmpty = queue.isEmpty(); System.out.println("队列是否为空? " + isEmpty); } } 
void addFirst(E e): 在队列的头部添加元素,如果失败抛出异常。void addLast(E e): 在队列的尾部添加元素,如果失败抛出异常。boolean offerFirst(E e): 在队列的头部添加元素,如果成功返回 true,如果失败返回 false。boolean offerLast(E e): 在队列的尾部添加元素,如果成功返回 true,如果失败返回 false。E removeFirst(): 移除并返回队列头部的元素,如果队列为空抛出异常。E removeLast(): 移除并返回队列尾部的元素,如果队列为空抛出异常。E pollFirst(): 移除并返回队列头部的元素,如果队列为空返回 null。E pollLast(): 移除并返回队列尾部的元素,如果队列为空返回 null。E getFirst(): 返回队列头部的元素,但不移除它,如果队列为空抛出异常。E getLast(): 返回队列尾部的元素,但不移除它,如果队列为空抛出异常。E peekFirst(): 返回队列头部的元素,但不移除它,如果队列为空返回 null。E peekLast(): 返回队列尾部的元素,但不移除它,如果队列为空返回 null。LinkedListArrayDequeLinkedBlockingDequeimport java.util.Deque; import java.util.ArrayDeque; public class DequeDemo { public static void main(String[] args) { // 创建一个ArrayDeque实例 Deque deque = new ArrayDeque<>(); deque.addFirst("你好"); // 在队列末尾添加元素 deque.addLast("苹果"); deque.addLast("香蕉"); deque.addLast("樱桃"); System.out.println("初始双端队列: " + deque); // 在队列开头添加元素 deque.addFirst("火龙果"); System.out.println("在队首添加后: " + deque); // 从队列开头移除并获取元素 String firstFruit = deque.removeFirst(); String s = deque.pollFirst(); System.out.println("从队首1移除: " + firstFruit); System.out.println("从队首2移除: " + s); System.out.println("移除后双端队列: " + deque); // 从队列末尾移除并获取元素 String lastFruit = deque.removeLast(); System.out.println("从队尾移除: " + lastFruit); System.out.println("再次移除后双端队列: " + deque); // 检查双端队列是否为空 boolean isDequeEmpty = deque.isEmpty(); System.out.println("大小" + deque.size()); System.out.println("双端队列是否为空? " + isDequeEmpty); } } 
LinkedList 和 PriorityQueue。LinkedList 和 ArrayDeque。觉得有用的话可以点点赞 (*/ω\*),支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。