Java中Queue队列

在Java集合框架中,Queue(队列)是一种遵循先进先出(FIFO,First In First Out) 原则的有序集合。它与List的最大区别在于操作的限制性:List允许在任意位置添加或删除元素,而Queue仅支持在队尾添加元素、从队首获取元素。

Queue的常用操作

Queue接口定义了一套规范的操作方法,可分为两类:操作失败时抛出异常操作失败时返回特定值

操作类型 抛出异常的方法 返回false或null的方法
向队尾添加元素 add(E e) boolean offer(E e)
从队首获取并删除元素 E remove() E poll()
从队首获取但不删除元素 E element() E peek()
获取队列长度 int size() -

方法解析

  1. 添加元素

    • add(E e):当队列有容量限制且已满时,会抛出IllegalStateException
    • offer(E e):添加失败时返回false(如队列已满),更适合处理可能失败的场景。

    示例:

    Queue<String> queue = new LinkedList<>();
    // 使用add()添加元素(可能抛异常)
    try {
    queue.add("任务1");
    System.out.println("添加成功");
    } catch (IllegalStateException e) {
    System.out.println("添加失败:队列已满");
    } // 使用offer()添加元素(返回布尔值)
    if (queue.offer("任务2")) {
    System.out.println("添加成功");
    } else {
    System.out.println("添加失败:队列已满");
    }
  2. 获取并删除元素

    • remove():当队列为空时,抛出NoSuchElementException
    • poll():当队列为空时,返回null,需注意避免向队列中添加null元素,否则无法区分“空队列”和“元素为null”。

    示例:

    // 使用remove()获取元素(可能抛异常)
    try {
    String task = queue.remove();
    System.out.println("处理任务:" + task);
    } catch (NoSuchElementException e) {
    System.out.println("获取失败:队列为空");
    } // 使用poll()获取元素(返回null表示失败)
    String nextTask = queue.poll();
    if (nextTask != null) {
    System.out.println("处理任务:" + nextTask);
    } else {
    System.out.println("获取失败:队列为空");
    }
  3. 获取但不删除元素

    • element():队列为空时抛出NoSuchElementException
    • peek():队列为空时返回null,常用于查看队首元素而不改变队列状态。

    示例:

    // 查看队首元素(不删除)
    System.out.println("当前队首任务:" + queue.peek()); // 多次调用结果相同

Queue的实现类与使用场景

Queue是接口,需通过具体实现类使用,最常用的是LinkedList(同时实现了ListQueue接口)。使用时应遵循“面向抽象编程”原则,声明为Queue类型以明确用途:

// 声明为Queue类型,强调队列特性
Queue<String> queue = new LinkedList<>();

总结

  1. 避免添加null元素poll()peek()返回null时,无法区分“队列为空”和“元素是null”,可能导致逻辑错误;
  2. 选择合适的方法:优先使用offer()poll()peek(),它们通过返回值而非异常处理失败,更适合大多数场景;
  3. 明确实现类特性:不同Queue实现类(如LinkedListArrayBlockingQueue)有不同特性(如是否有容量限制),需根据需求选择。

Java集合——10.使用Queue的更多相关文章

  1. java 集合 队列(Queue)

    特点:特殊线性表,先进先出(FIFO first-in-first-out) 方法: java5中 添加java.util.Queue接口,java.util.Collection 的扩展类 add( ...

  2. Java 集合深入理解(9):Queue 队列

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情不太好,来学一下 List 吧! 什么是队列 队列是数据结构中比较重要的一种类型,它支持 FIFO,尾部添加.头部 ...

  3. java集合树状结构及源码

    java集合树状结构及源码 最近一直想看一下java集合的源码,毕竟平时用的比较多,但总是感觉是跟着习惯new出来一个对象,比如ArrayList,HashMap等等,所以就简单的看了一下,了解了一下 ...

  4. Java集合(一):Java集合概述

    注:本文基于JDK 1.7 1 概述 Java提供了一个丰富的集合框架,这个集合框架包括了很多接口.虚拟类和实现类. 这些接口和类提供了丰富的功能.可以满足主要的聚合需求. 下图就是这个框架的总体结构 ...

  5. day27--Java集合10

    Java集合10 21.集合家庭作业 21.1Homework01 按要求实现: 封装一个新闻类,包括标题和内容属性,提供get.set方法,重写toString方法,打印对象时只打印标题: 只提供一 ...

  6. Java集合的Stack、Queue、Map的遍历

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  7. 【由浅入深理解java集合】(四)——集合 Queue

    今天我们来介绍下集合Queue中的几个重要的实现类.关于集合Queue中的内容就比较少了.主要是针对队列这种数据结构的使用来介绍Queue中的实现类. Queue用于模拟队列这种数据结构,队列通常是指 ...

  8. Java集合—Queue(转载)

    Queue用于模拟队列这种数据结构,队列通常是指“先进先出”(FIFO)的容器.新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素.通常,队列不允许随机访问队列中的元素 ...

  9. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

  10. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. ActiveMQ的安装与部署

       ActiveMQ是Apache的一个开源项目,它是一个功能强劲的开源消息总线,也是一个中间件产品,它是JMS的一个实现.   在介绍ActiveMQ之前,先来复习一下J2EE中的JMS规范.JM ...

  2. Python基础—初识函数(二)

    1.给函数参数增加元信息 写好一个函数,然后想为这个函数的参数增加一些额外的信息,这样的话其他使用者就能清楚的知道这个函数应该怎么使用. 使用函数参数注解是一个很好的办法,它能提示程序员应该怎样正确使 ...

  3. 一则复杂 SQL 改写后有感

    抱歉很久没写技术博客. 自从LLM爆发之后,写概念堆叠的所谓"博客"已经没有意义了,那么我会思考我的博客还有什么作用. 得出的结论是:具体业务的讨论仍然是有价值的 所以之后会随缘更 ...

  4. C#实现语音预处理:降噪、静音检测、自动增益(附Demo源码)

    无论是在音视频录制系统,还是音视频通话系统.或视频会议系统中,对从麦克风采集到的说话的声音数据进行预处理,都是是非常必要的. 语音数据预处理主要包括:​​降噪(Noise Reduction).静音检 ...

  5. DotTrace系列:6. 程序异常诊断 和 Request慢处理

    一:背景 1. 讲故事 在我分析的众多dump中,有一些CPU爆高是因为高频的抛 Exception 导致,比如下面这张图,有 19 个线程都在抛 xxxResultException 异常. 从卦中 ...

  6. Java实现word试卷逐题录入数据库

    word题目类似如图 将这样一份试题录入数据库实现如下图效果(给app 考试系统 写的java后台) 主要思路是 1.把word文档整理成你想要的格式,让每道题格式一样 2.字符串形式获得word文档 ...

  7. .NET周刊【6月第4期 2025-06-22】

    国内文章 推荐 3 种 .NET Windows 桌面应用程序自动更新解决方案 https://www.cnblogs.com/Can-daydayup/p/18927721 本文介绍了在快速迭代的软 ...

  8. 前端开发系列083-Node篇之http

    本文对Node的内置模块http进行介绍,包括该模块的基本情况和简单使用. 一.模块简介 http是Node的内置核心模块,包含了对HTTP处理的封装. 在Nodejs文件中可以直接在代码里通过var ...

  9. MySQL 13 为什么表数据删掉一半,表文件大小不变?

    一个InnoDB表包含两部分:表结构定义和数据.在MySQL 8.0版本前,表结构存在以.frm为后缀的文件里.之后的版本允许把表结构定义放在系统数据表中.由于表结构定义占用空间很小,所以主要讨论表数 ...

  10. Gym - 101147 & 队内自训#2 题解

    A - The game of Osho 题意:每次给你G堆石子,每堆有\(n{_i}\)个,一次可挑走\(B{_i}^k\)个.最后不能选的人输.问最后先手赢还是后手赢. 思路:从SG表的方式入手. ...