从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

  • JavaSenior

    • 反射

    • 注解

    • 集合类

      • 集合介绍
      • List
      • Map
      • Set
      • Queue
        • 常用方法
        • PriorityQueue
        • Deque
      • Stack
      • Collections
    • 线程

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java
  • JavaSenior
  • 集合类
2022-12-31
目录

Queue

# Queue

Queue 是实现了一个先进先出(FIFO:First In First Out)的有序表,也是非常常用的。

它和 List 的区别在于,List 可以在任意位置添加和删除元素,而 Queue 只有两个操作:

  • 把元素添加到队列末尾;
  • 从队列头部取出元素。

# 常用方法

队列接口 Queue 定义了以下几个方法:

  • int size():获取队列长度;
  • boolean add(E)/boolean offer(E):添加元素到队尾;
  • E remove()/E poll():获取队首元素并从队列中删除;
  • E element()/E peek():获取队首元素但并不从队列中删除。

两套方法的区别在于:前面一套在执行失败的时候会抛出异常,后面一套会返回 false 或 null,按需选择。

演示下:

    Queue<String> q = new LinkedList<>();
    q.offer("apple");
    q.offer("banana");
    q.offer("pear");
    System.out.println(q.poll()); //apple
    System.out.println(q.poll()); //banana
    System.out.println(q.poll()); //pear
    System.out.println(q.poll()); //null


    q.offer("apple");
    System.out.println(q.peek()); //apple
    System.out.println(q.peek()); //apple
    System.out.println(q.peek()); //apple
1
2
3
4
5
6
7
8
9
10
11
12
13
14

其他注意事项:

  • 可以,但不要把 null 添加到队列中,否则 poll() 方法返回 null 时,很难确定是取到了 null 元素还是队列为空
  • 对于具体的实现类,有的 Queue 有最大队列长度限制,有的 Queue 没有
  • LinkedList 即实现了 List 接口,又实现了 Queue 接口

# PriorityQueue

有时候,我们会用到优先队列,而用 Queue 是实现不了的,因此我们可以用 PriorityQueue,其内部是根据 Comparable 接口来决定顺序。例如

    Queue<String> q = new PriorityQueue<>();
    q.offer("apple");
    q.offer("pear");
    q.offer("banana");
    System.out.println(q.poll()); //apple
    System.out.println(q.poll()); //banana
    System.out.println(q.poll()); //pear
1
2
3
4
5
6
7

我们放入的顺序是 "apple"、"pear"、"banana",但是取出的顺序却是 "apple"、"banana"、"pear",这是因为从字符串的排序看,"apple" 排在最前面,"pear" 排在最后面。

因此,放入 PriorityQueue 的元素,必须实现 Comparable 接口,或者在创建 PriorityQueue 的时候提供一个 Comparator 对象。

# Deque

Queue 是队列,只能一头进,另一头出。如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名 Deque。

Deque 是一个接口,它的实现类有 ArrayDeque 和 LinkedList。

Deque 常用方法:

  • addLast(E e) / offerLast(E e):添加元素到队尾
  • E removeFirst() / E pollFirst():取队首元素并删除
  • E getFirst() / E peekFirst():取队首元素但不删除
  • addFirst(E e) / offerFirst(E e): 添加元素到队首
  • E removeLast() / E pollLast():取队尾元素并删除
  • E getLast() / E peekLast():取队尾元素但不删除

Queue 提供的 add()/offer() 方法在 Deque 中也可以使用,但是最好使用 Deque 的方法。

演示如下:

    Deque<String> deque = new LinkedList<>();
    deque.offerLast("A"); // A
    deque.offerLast("B"); // A <- B
    deque.offerFirst("C"); // C <- A <- B
    System.out.println(deque.pollFirst()); // C, 剩下A <- B
    System.out.println(deque.pollLast()); // B, 剩下A
    System.out.println(deque.pollFirst()); // A
    System.out.println(deque.pollFirst()); // null
1
2
3
4
5
6
7
8
上次更新: 2024/10/1 18:45:09
Set
Stack

← Set Stack→

最近更新
01
吐槽一下《僵尸校园》
05-15
02
2025 年 4 月记
04-30
03
山西大同 “订婚强奸案” 将会给整个社会带来的影响有多严重? - 知乎 转载
04-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式