Queue
2022-02-27 本文已影响0人
Alsan_L3
Queue是Java中实现队列的一个接口,队列的概念用通俗的话说就是排队,必须满足先进先出(FIFO)规则,Java中队列有很多实现类或抽象接口,我们本章就来简要介绍这些类。在看这些实现类之前,我们先来看下Queue这个接口中定义了哪些方法,有什么特点?
Queue中定义了6个方法,分别是add、remove、element、offer、poll、peek后三个方法对应前三个功能上是一样的,只不过前三个碰到异常情况时是抛出异常,后三个则返回null或false,使用是大家可以根据实际情况使用。如下表:
方法 | 操作失败 |
---|---|
add | throw IllegalStateException |
offer | return false |
remove | throw NoSuchElementException |
poll | return null |
element | throw NoSuchElementException |
peek | return null |
接下来我们简要看下Queue的部分实现类:
- PriorityQueue:保存队列元素的顺序不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序。当调用peek()或者poll()方法获取队列元素时,获取的是队列最小元素,而不是先入队列的元素。可以理解为按顺序排队。
- Deque:是双端队列。可以同时从两端(队列头部和尾部)添加、删除元素。所以可以用来实现栈的数据结构。有两个实现类(ArrayDeque和LinkedList)。
- ArrayDeque:底层实现类似于ArrayList,都是通过动态、可分配的Object[]数组来实现元素存储,当集合元素超过数组容量,会重新分配一个新的数组来存储集合元素。
- LinkedList:LinkedList实现List,同时也实现了Deque,可以当做双端队列来使用,可以当做“栈”或“队列”使用。 LinkedList与ArrayList、ArrayDeque不同之处在于底层实现,LinkedList底层是通过链表的形式存储元素,随机访问性能比较差,但是在插入、删除的时候性能比较好
- BlockingQueue:扩展了Queue,增加了可阻塞的插入和获取的操作。如果队列是空, 那么获取元素的操作将一直阻塞,直到队列中出现一个可用的原色。如果队列已经满了, 那么插入元素的操作将一直阻塞, 直到队列中出现可用的空间。在集合框架中,有BlockingQueue的多种实现,其中LinkedBlockingQueue 和 ArrayBlockingQueue 是FIFO队列,二者分别与LinkedList和ArrayList 类似,但是比同步list有更好的并发性能。PriorityBlockingQueue是一个按照优先级排序的队列。