当前位置: 首页 > news >正文

Java集合——10.使用Queue

目录
  • Java中Queue队列
    • Queue的常用操作
      • 方法解析
    • Queue的实现类与使用场景
    • 总结


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)有不同特性(如是否有容量限制),需根据需求选择。
http://www.sczhlp.com/news/11436/

相关文章:

  • 树链剖分详解(长链剖分)
  • 圆锥曲线二级结论
  • 新版EIDE创建C51_with_keil5模板方法
  • 【日记】2025-8-13
  • 谷歌账号停用申诉 google账户被封如何解封 如何填写申诉理由和找回账号
  • CompletableFuture
  • 大東聰明家App技术支持
  • 【碎碎念】无题
  • 联想Lenovo R7000P-2025款 安装 Ubuntu linux 后没有 mt7925 网卡驱动(网卡不能正常运行或无法识别)的解决方案
  • 【LeetCode 199】力扣算法:二叉树的右视图
  • SPI与菊花链
  • Java集合——9.使用Set
  • vue基础
  • 目标使用过期的TLS1.0 版协议与目标主机支持RSA密钥交换 漏洞修复 系统:windows10 - L-+*
  • python虚拟环境和包管理工具Pipenv详解
  • PG系列:pg_probackup的时间点恢复失败案例分析
  • OOP:构造方法
  • 日程管理功能的后端开源组件精选方案
  • 软考系统分析师每日学习卡 | [日期:2025-08-13] | [今日主题:逻辑结构设计]
  • MySQL查询表结构、表大小
  • xUnit 单元测试:如何构造可共享的测试实例?
  • 苹果紧急修复针对Chrome用户的零日漏洞
  • 一文详解2025年医疗器械CRM怎么选?(附选型要素、实施指南、服务商推荐、案例解读) - SaaS软件
  • 双重计数
  • 用块状数组求解区间众数问题
  • Java抛出异常
  • Java IO流
  • python虚拟环境详解
  • 在AI技术快速落地的时代,挖掘真实需求成为关键——某知名Go SDK框架需求洞察
  • 一步一步学习使用LiveBindings(12) LiveBindings与具有动态呈现的TListView