Queue是java中实现队列的接口,它总共只有6个方法,我们一般只用其中3个就可以了。Queue的实现类有LinkedList和PriorityQueue。最常用的实现类是LinkedList。

Queue的6个方法分类:

压入元素(添加):add()、offer()
相同:未超出容量,从队尾压入元素,返回压入的那个元素。
区别:在超出容量时,add()方法会对抛出异常,offer()返回false

弹出元素(删除):remove()、poll()
相同:容量大于0的时候,删除并返回队头被删除的那个元素。
区别:在容量为0的时候,remove()会抛出异常,poll()返回false

获取队头元素(不删除):element()、peek()
相同:容量大于0的时候,都返回队头元素。但是不删除。
区别:容量为0的时候,element()会抛出异常,peek()返回null。

队列除了基本的 Collection 操作外,还提供特有的插入、提取和检查操作(如上)。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。

队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的头 都是调用 remove() 或 poll() 所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个 Queue 实现必须指定其顺序属性。

如果可能,offer 方法可插入一个元素,否则返回 false。这与 Collection.add 方法不同,该方法只能通过抛出未经检查的异常使添加元素失败。offer 方法设计用于正常的失败情况,而不是出现异常的情况,例如在容量固定(有界)的队列中。

remove() 和 poll() 方法可移除和返回队列的头。到底从队列中移除哪个元素是队列排序策略的功能,而该策略在各种实现中是不同的。remove() 和 poll() 方法仅在队列为空时其行为有所不同:remove() 方法抛出一个异常,而 poll() 方法则返回 null。

element() 和 peek() 返回但不移除队列的头。

Queue 接口并未定义阻塞队列的方法,而这在并发编程中是很常见的。BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口。

Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。

Queue 实现通常未定义 equals 和 hashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本,因为对于具有相同元素但有不同排序属性的队列而言,基于元素的相等性并非总是定义良好的。

看一个简单的示例:

public class QueueTest {public static void main(String[] args) {Queue<String> queue = new LinkedList();queue.offer("元素A");queue.offer("元素B");queue.offer("元素C");queue.offer("元素D");queue.offer("元素E");while (queue.size() > 0) {String element = queue.poll();System.out.println(element);}}
}

输出结果:

元素A
元素B
元素C
元素D
元素EProcess finished with exit code 0

可以看到,queue是一个先进先出的队列。

Java队列Queue使用详解(*)相关推荐

  1. 【Java】Java队列Queue使用详解

    Deque是一个双端队列接口(double ended queue),继承自Queue接口,Deque的实现类是LinkedList.ArrayDeque.LinkedBlockingDeque,其中 ...

  2. python queue 查询是否在队列中_python队列Queue的详解

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  3. C++队列queue用法详解

    一.定义 queue是一种容器转换器模板,调用#include< queue>即可使用队列类. 二.queue初始化 queue<Type, Container> (<数 ...

  4. python队列只能一个个读取吗_python队列Queue的详解

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  5. python队列Queue的详解

    Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信. 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个 ...

  6. AQS抽象队列同步器原理详解

    系列文章目录 第一节 synchronized关键字详解-偏向锁.轻量级锁.偏向锁.重量级锁.自旋.锁粗化.锁消除 AQS抽象队列同步器原理详解 系列文章目录 前言 一.AQS特性 二.AQS原理 1 ...

  7. Java JUC并发编程详解

    Java JUC并发编程详解 1. JUC概述 1.1 JUC简介 1.2 进程与线程 1.2 并发与并行 1.3 用户线程和守护线程 2. Lock接口 2.1 Synchronized 2.2 什 ...

  8. JAVA 多线程并发超详解

    JAVA 多线程并发超详解(未完,下一篇文章还有) 1. JAVA 多线程并发 1.1.1. JAVA 并发知识库 1.1.2. JAVA 线程实现/创建方式 1.1.2.1. 继承 Thread 类 ...

  9. 你真的弄明白了吗?Java并发之AQS详解

    你真的弄明白了吗?Java并发之AQS详解 带着问题阅读 1.什么是AQS,它有什么作用,核心思想是什么 2.AQS中的独占锁和共享锁原理是什么,AQS提供的锁机制是公平锁还是非公平锁 3.AQS在J ...

最新文章

  1. pmp考试必知的十个图和表
  2. windows 中 Eclipse 打开当前文件所在文件夹
  3. Java语言编码规范
  4. 一图看懂学位服:学位帽、学位袍、流苏、垂布
  5. Google Project Zero挖洞经验整理
  6. 动态规划算法-06Longest Valid Parentheses问题
  7. Dapper操作MySQL数据库获取JSON数据中文乱码
  8. C++基础15-类和对象之多态
  9. WEB安全基础-WEB服务器相关知识
  10. 剑指offer——21.调整数组顺序使奇数位于偶数前面
  11. 为全力发展AIOT,小米把松果电子分拆重组了
  12. 拓端tecdat|R语言中的block Gibbs吉布斯采样贝叶斯多元线性回归
  13. 玩转 SSH(六):SpringMVC + MyBatis 架构搭建(注解版)
  14. (转) Java线程池实现原理及其在美团业务中的实践
  15. 阿里云服务器可以用来干什么?
  16. arcgis engine已知图幅号获取比例尺
  17. 人脸识别(1)---人脸识别长篇研究
  18. 【数据结构】哈夫曼编码
  19. 学习到第一个国庆的感想
  20. css 裁剪背景图片,CSS裁剪背景图片的歪招

热门文章

  1. AG表格基础滚动分页-React版本
  2. [性能测试] Python 内存数据库 Cyber​​DB VS Redis
  3. 父亲节写给父母:电子通信为什么要转行计算机软件
  4. FPGA 四画面视频分割逻辑框图
  5. Python深浅copy
  6. APP上线前,如何做运营推广工作?
  7. linux ntfs转化xfs,使用 Fstransform 转换文件系统
  8. 电脑桌面计算机打开很慢,Win10系统打开此电脑很慢总显示在加载的解决方法
  9. anaconda无法打开显示there is an instance of anaconda navigator already running ——如何解决
  10. 怎样从0开始搭建一个测试框架_10——数据生成器(全网最全)