Java集合框架(九):Queue 源码分析

本文详细分析了Java中的Queue接口,包括Queue的简述、类图、方法以及常用操作。讨论了Java如何从数组创建队列、队列到数组的转换,并通过实例展示了add、offer、remove、poll、element、peek等操作的区别和用法。此外,还介绍了Java队列的分类,如有界队列、无界队列、阻塞队列和非阻塞队列,以及它们在并发编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Queue 简述

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

Java Queue是java.util包中提供的接口,并扩展了java.util.Collection接口。
就像Java List一样,Java Queue是有序元素(或对象)的集合,但它以不同方式执行插入和删除操作。 在处理这些元素之前,我们可以使用Queue存储元素。

在这里插入图片描述

  • java.util.Queue接口是java.util.Collection接口的子类型。

  • 就像现实世界的排队(例如,在银行或ATM中)一样,Queue在队列的末尾插入元素并从队列的开头删除元素。

  • Java Queue遵循FIFO顺序来插入和删除它的元素。 FIFO代表先入先出。

  • Java Queue支持Collection接口的所有方法。

  • 最常用的Queue实现是LinkedList,ArrayBlockingQueue和PriorityQueue。

  • BlockingQueues不接受null元素。 如果我们执行任何与null相关的操作,它将抛出NullPointerException。

  • BlockingQueues用于实现基于生产者/消费者的应用程序。

  • BlockingQueues是线程安全的。

  • java.util包中可用的所有队列都是无界队列,java.util.concurrent包中可用的队列是有界队列。

  • 所有Deques都不是线程安全的。

  • ConcurrentLinkedQueue 是一个基于链表的无界线程安全队列。

  • 除了Deques之外,所有队列都支持在队列尾部插入并在队列的头部删除。

  • Deques 是双端队列,它支持在队列两端插入和移除元素。

在这里插入图片描述

2、Queue 类图

在这里插入图片描述

Java Queue 接口扩展了 Collection 接口。 Collection 接口扩展了 Iterable 接口。 一些常用的Queue实现类是 LinkedList,PriorityQueue,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue 等.AbstractQueue 提供了 Queue 接口主要方法的实现,以减少实现 Queue 的工作量。

3、Queue 方法简述

队列通常(但不一定)以FIFO(先进先出)方式对元素进行排序。例外的是优先级队列,它根据提供的比较器对元素进行排序,或者元素的自然排序,以及LIFO队列(或堆栈),它们对元素LIFO(后进先出)进行排序。

无论使用什么顺序,队列的头部都是通过调用remove()或poll()来删除的元素。 在FIFO队列中,所有新元素都插入队列的尾部。

其他类型的队列可能使用不同的放置规则。 每个Queue实现都必须指定其排序属性。

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

队列实现通常不允许插入null元素,尽管某些实现(如LinkedList)不禁止插入null。 即使在允许它的实现中,也不应将null插入到Queue中,因为null也被poll方法用作特殊返回值,以指示队列不包含任何元素。

下面我们将讨论一些有用且经常使用的 Java Queue 方法:

boolean add(E e): 如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此队列,成功时返回true,如果当前没有可用空间则抛出IllegalStateException。

boolean offer(E e): 如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此队列,成功时返回true,如果当前没有可用空间则返回 false。

E remove():检索并删除此队列的头部元素。 此方法与poll的不同之处仅在于,如果此队列为空,则抛出异常 NoSuchElementException。

E poll(): 检索并删除此队列的头部,如果此队列为空,则返回null。

E element():检索但不删除此队列的头部。 此方法与peek的不同之处仅在于,如果此队列为空,则抛出异常 NoSuchElementException。

E peek():检索但不移除此队列的头部,如果此队列为空,则返回null。

4、Java Array to Queue

在这里,我们将通过一个简单的例子演示如何使用“Collections.addAll()”方法将Java数组转换为Queue。

 public sta
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值