【Java】关于Queue的用法总结
原文链接:https://blog.csdn.net/qq_25353433/article/details/88016369
之前对Queue只有一知半解,常用它的某几个方法,却不知道其中的区别,看了官方文档今天来总结一下。
一、简介:
Interface Queue<E> 出自Java.util,是个公共接口,它的父接口有我们熟知的Collection<E>和Iterable<E> (这两个有空再总结),它的子接口有:BlockingDeque<E>, BlockingQueue<E>, Deque<E>, TransferQueue<E> (这几个没咋用过,抽空可以学习一下)
实现它的类有:AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, SynchronousQueue其中我们最熟悉的就是 LinkedList了。
二、方法:
在具体介绍方法之前,再从整体上了解一下Queue,除了基本的Collection操作以外,Queue还提供了额外的插入,提取和检查操作,这些方法都有两种形式:一种在操作失败时会抛出异常(异常什么的下次总结!),另一种返回特殊值(根据操作不同返回null或false),后一种形式的插入操作是专门给容量受限的队列实现来设计的,不过在大多数实现中,插入操作不会失败。
Throws Exception抛出异常 | Returns special value返回特殊值 | |
---|---|---|
Insert 插入 | add(e) | offer(e) |
Remove 删除 | remove() | poll() |
Examine 校验 | element() | peek() |
队列通常(但不一定)以先进先出(FIFO)的方式对元素排序,例外是优先级队列,它根据提供的比较器对元素进行排列、或按自然顺序对元素进行排列,以及按后进先出(LIFO)排序(栈),无论用什么顺序,队列头部都是通过调用remove()或poll()删除元素,在FIFO队列中,新元素都是插入到队列尾部,其他类型的队列可能有不同的放置规则,每个队列实现都必须指定它的排序属性。
offer()方法在可能的情况下插入一个元素,否则返回false,这和Collection.add方法不同,后者只能通过抛出一个uncheck Exception来表示插入元素失败(什么是不检查异常?下次总结),offer()方法是为了正常情况下的“失败”而设计的,而不是异常情况,比如固定容量的队列。
remove()和poll()方法删除并且返回队首元素,至于从队列中删除哪一个元素就和队列排序策略的函数实现有关了(有各种实现),remove()和poll()的不同仅仅在于,当队列为空时他们的行为不同:remove()抛出异常,poll()返回null。
element()和peek()方法返回但不删除队首元素。
Queue接口没有定义阻塞队列的方法,这些方法在它的扩展接口BlockingQueue中有定义。
虽然有些实现(如LinkedList)也不禁止插入null值,但Queue的实现通常不允许插入null值。 尽管有些实现允许插入null值,但最好还是不要这么做,因为null值是作为poll()方法的特殊返回值的,他表示当前队列为空,如果插入null值就会引起混乱了。
Queue的实现中通常不定义基于元素版本的equals方法和hashCode方法,而是从Object类继承基于identity的版本,因为对于具有相同元素但顺序不同的队列,并不总是定义了基于元素的相等性。
-----------------------------------------分割线----------------------------------------------------------------------------------------------
现在我们对Queue和它的方法都有了一个概念上的认识和区分,接下来就进一步的来探索这些方法吧~
add(e) 方法
boolean add(E e)
在不违反容量限制的情况下将元素插入队列,插入成功返回true,如果没有可用空间则抛出IllegalstateException。
继承自:Collection的add()
参数:e-要插入的元素
返回: true
抛出:
IllegalStateException
- 由于容量限制插入失败
ClassCastException
- 由于指定元素的类禁止将其添加到队列中
NullPointerException
- 由于指定元素为null且队列不允许有null值
IllegalArgumentException
- 由于元素的某些属性禁止将其添加到队列中
Queue<Integer> queue = new LinkedList<Integer>();
System.out.println(((LinkedList<Integer>) queue).add(1));
Queue<Integer> queue2 = new ArrayDeque<>(2);
System.out.println(queue2.add(1));
/*
输出:
true
true
*/
(异常的情况下次补充吧~)
offer(E e)
boolean offer(E e)
在不违反容量限制的情况下将元素插入队列,对于使用容量限制的队列来说,offer方法比add方法更可取。
参数:e-要插入的元素
返回: 插入成功-true,失败-false
抛出:
ClassCastException
- 由于指定元素的类禁止将其添加到队列中
NullPointerException
- 由于指定元素为null且队列不允许有null值
IllegalArgumentException
- 由于元素的某些属性禁止将其添加到队列中
System.out.println(queue.offer(2));
System.out.println(queue2.offer(2));
/*
输出:
true
true
*/
remove()
E remove()
返回并删除队首元素,该方法和poll()方法的不同在于,当队列为空时它会抛出异常。
返回:队首元素
抛出:NoSuchElementException
- 队列为空
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer(2);
System.out.println(queue.remove());
System.out.println(queue.remove());
输出:
2
Exception in thread "main" java.util.NoSuchElementException
poll()
E poll()
返回并删除队首元素,如果队列为空,则返回null。
返回:队首元素,队列为空返回null
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer(2);
System.out.println(queue.poll());
System.out.println(queue.poll());
输出:
2
null
element()
E element()
返回但不删除队首元素,该方法和peek()方法的不同在于,当队列为空时它会抛出异常。
返回:队首元素
抛出:NoSuchElementException
- 队列为空
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer(2);
System.out.println(queue.element());
queue.poll();
queue.element();
输出:
2
Exception in thread "main" java.util.NoSuchElementException
peek()
E peek()
返回但不删除队首元素,队列为空时返回null。
返回:队首元素,队列为空返回null
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer(2);
System.out.println(queue.peek());
queue.poll();
System.out.println(queue.peek());
输出:
2
null
最后:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2022-03-23 springboot允许跨域注解_SpringBoot项目针对跨域问题的三种解决方案 在Spring Boot 中给我们提供了一个注解 @CrossOrigin 来实现跨域
2022-03-23 C# WebService创建与使用
2022-03-23 Thymeleaf - 使用方法及国际化(超详细) springboot Thymeleaf是一个和Velocity、FreeMarker 类似的模板引擎,它在有网络和无网络的环境下皆可运行
2022-03-23 Udesk微前端之路
2022-03-23 jpa 常用查询方法记录
2022-03-23 mybatis注解多表查询
2022-03-23 Mybatis基于注解实现多表查询