首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java Queue接口源码解读和应用

LinkedList、ArrayDeque 都是Queue 接口的子类,还是有必要把Queue 这个接口的源码再过一遍,让我们站在更高层来看这几个类。

说到 Queue(队列),我们会想到先进先出这个概念。 在 Java 中,Queue 接口是一个定义队列数据结构的接口,位于 java.util 包中。

Queue 接口扩展了 Collection 接口,表示一种 先进先出(FIFO) 的数据结构,用于按顺序存储并操作元素。

我们可以通过 Queue 实现类(如 LinkedList、PriorityQueue、ArrayDeque 等)来使用具体的队列实现。

一、Queue 接口中的方法

Queue 接口定义了几个核心方法,主要用于插入、删除和查看队列中的元素。方法可以分为两类:抛出异常 和 返回特定值 的方法。

1. 添加元素的方法

boolean add(E e):将指定的元素插入到队列中。如果队列已满(主要在有限容量的队列实现中),则抛出 IllegalStateException 异常。该方法返回 true,表示元素成功插入。

boolean offer(E e):将指定的元素插入到队列中。如果队列已满,则返回 false,而不是抛出异常。这个方法通常用于限制容量的队列(如阻塞队列)中。

add方法与offer方法的区别在于:add在插入失败时抛出异常,而offer则返回false。

2. 移除元素的方法

E remove():移除并返回队列的头部元素。如果队列为空,则抛出 NoSuchElementException。

E poll():移除并返回队列的头部元素。如果队列为空,则返回 null。

remove和poll的区别在于:remove在队列为空时抛出异常,而poll返回null。

3. 查看元素的方法

E element():返回队列的头部元素,但不删除。如果队列为空,则抛出 NoSuchElementException。

E peek():返回队列的头部元素,但不删除。如果队列为空,则返回 null。

element和peek的区别在于:element在队列为空时抛出异常,而peek返回null。

4、方法总结

二、示例代码

为了帮助理解这些方法,下面是一个使用 Queue 接口及其实现 LinkedList 的示例代码:

import java.util.LinkedList;

import java.util.Queue;

public class QueueExample {

public static void main(String[] args) {

Queue<Integer> queue = new LinkedList<>();

// 使用 add() 方法添加元素

queue.add(10);

queue.add(20);

queue.add(30);

System.out.println("队列元素: " + queue); // 输出: [10, 20, 30]

// 使用 element() 方法获取头部元素

System.out.println("队列头部元素 (element): " + queue.element()); // 输出: 10

// 使用 remove() 方法删除头部元素

System.out.println("移除元素 (remove): " + queue.remove()); // 输出: 10

System.out.println("队列元素: " + queue); // 输出: [20, 30]

// 使用 offer() 添加元素

queue.offer(40);

System.out.println("队列元素 (offer 后): " + queue); // 输出: [20, 30, 40]

// 使用 poll() 方法删除头部元素

System.out.println("移除元素 (poll): " + queue.poll()); // 输出: 20

System.out.println("队列元素: " + queue); // 输出: [30, 40]

// 使用 peek() 方法查看头部元素

System.out.println("队列头部元素 (peek): " + queue.peek()); // 输出: 30

}

}

运行结果:

队列元素: [10, 20, 30]

队列头部元素 (element): 10

移除元素 (remove): 10

队列元素: [20, 30]

队列元素 (offer 后): [20, 30, 40]

移除元素 (poll): 20

队列元素: [30, 40]

队列头部元素 (peek): 30

三、Queue的设计思路

Queue 的设计使得用户可以轻松实现 FIFO 行为,同时根据需求选择抛出异常或返回特定值的操作。

Queue 的接口中没有提供直接的遍历方法,这是因为队列的核心功能在于元素的插入、删除和查看,而不是随机访问。对于队列的遍历,一般可以使用 迭代器。

Queue 可以用作底层数据结构,实现多种算法(如广度优先搜索)和系统功能(如任务调度)。

四、Queue的常用实现类

LinkedList:LinkedList 是 Queue 接口的实现之一,支持 null 元素,适合在需要频繁插入和删除的场景下使用。

PriorityQueue:基于优先级堆的实现,按元素的自然顺序(或通过 Comparator 指定的顺序)排序,不允许 null 元素。

ArrayDeque:基于动态数组实现的双端队列,支持队列的所有操作,且效率较高,不允许 null 元素。

五、最后总结

Queue 接口定义了 Java 中队列的基本行为,提供了对元素的插入、移除和查看的规范,用户可以基于其实现类来选择适合的队列类型。通过区分抛出异常和返回 null 的方法,Queue 提供了较高的灵活性,适合在不同场景中使用。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OGCQlNWP98k7LIs5zS_Lwsaw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券