8.2.4、Queue队列
队列是一种特殊的线性表,具有先入先出、后入后出的基本原则(但也有例外的情况:优先级队列、LIFO 队列等),一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是java的某些队列运行在任何地方插入删除(如:Deque接口,继承Queue接口,是一种双端队列)。
允许入队的一端为队尾,允许出的的一端为队头,没有任何元素的队列为空队。
![image-20220803121230168](https://i-blog.csdnimg.cn/blog_migrate/5b959d75c69bf0366baf265943232821.png)
队列的分类:
- 从阻塞上
- 阻塞队列:出列、入列都有阻塞,不会导致队列溢出,线程安全
- 元素入列时,如果数量超过了队列的容量,会进入等待阻塞,等到队列中有元素出列,元素数量小于队列容量时,解除阻塞。
- 如果队列内无值,但进行出列操作,也会进入阻塞,等队列有值后解除阻塞
- 非阻塞队列:出列、入列都没有阻塞
- 入列时,元素超过队列总数会报异常
- 出列时,无元素会得到空值
- 阻塞队列:出列、入列都有阻塞,不会导致队列溢出,线程安全
- 从界限上
- 有界:有大小限制
- 无界:也有大小限,但是会自动进行扩容
- 链表
- 单向链表
- 双向链表
1、Queue
Queue继承自Collection接口,是java中实现队列的接口,它总共只有6个方法。
1、添加元素:
boolean add(E e):将元素e插入队列末尾,超出容量时返回异常IllegalStateException
boolean offer(E e):将元素e插入队列末尾,成功返回true,失败返回false
2、移除元素:
E remove():删除元素头部并返回,如果此队列为空,则抛出异常NoSuchElementException
E poll():删除元素头部并返回,果此队列为空,则返回null
3、E element():返回队列头部的元素,如果此队列为空,它将引发异常NoSuchElementException
4、E peek():返回队列头部的元素,如果此队列为空返回null
![image-20220803163855867](https://i-blog.csdnimg.cn/blog_migrate/b49e175fba1802b7a5b8c2ea6d132024.png)
Queue的子接口及其实现类
![image-20220803183055203](https://i-blog.csdnimg.cn/blog_migrate/44e25c8cc422d79fa330e6a2b624af5c.png)
- 双向队列Deque
- LinkedList:大小可变的链表双端队列,允许元素为插入null。
- ArrayDeque:大小可变的数组双端队列,不允许插入null。
- 阻塞队列类
- DelayQueue:支持延时获取元素的无界阻塞队列
- LinkedTransferQueue:由链表结构组成的无界阻塞队列。
- ArrayBlockingQueue:有界队列,阻塞,初始化时指定队列大小,且不可改变,底层由数组实现。
- SynchronousQueue:只能存储一个元素,每一个put操作必须等待一个take操作,否则不能继续添加元素
- PriorityBlockingQueue:带优先级的队列(不按先进先出规则)。元素按优先级顺序被移除,无界队列。
- 非阻塞类
- ConcurrentLinkedQueue:单向链表结构的无界并发队列,由CAS实现线程安全,内部基于节点实现
- ConcurrentLinkedDeque:双向链表结构的无界并发队列, 非阻塞队列,由CAS实现线程安全
- PriorityQueue:内部基于数组实现,线程不安全的队列
2、Deque
Queue的子接口,是一个双端队列,支持两端元素插入和移除,此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
1、void addFirst(E e):在此双端队列的前面插入指定元素,如果当前没有可用空间,则抛出IllegalStateException 。
2、void addLast(E e):在此双端队列末尾插入指定元素,如果当前没有可用空间,则抛出IllegalStateException
3、 boolean offerFirst(E e):在双端队列的前面插入指定元素,如果元素已添加到此双端队列,则为true ,否则为false
4、boolean offerLast(E e):在此双端队列末尾插入指定元素,如果元素已添加到此双端队列,则为true ,否则为false
5、E removeFirst():删除此双端队列的第一个元素并返回,如果此双端队列为空则抛出NoSuchElementException
6、E removeLast():删除此双端队列的最后一个元素并返回,如果此双端队列为空则抛出NoSuchElementException
7、E pollFirst():删除此双端队列的第一个元素并返回,如果此双端队列为空,则返回null
8、E pollLast():删除此双端队列的最后一个元素并返回,如果此双端队列为空,则返回null
9、E getFirst():返回第一个元素,如果此双端队列为空抛出NoSuchElementException
10、E getLast():返回最后一个元素,如果此双端队列为空抛出NoSuchElementException
11、E peekFirst():返回第一个元素,如果此双端队列为空,则返回null 。
12、E peekLast():返回最后一个元素,如果此双端队列为空,则返回null 。
13、boolean removeFirstOccurrence(Object o):从此双端队列中删除第一次出现的指定元素,如果双端队列不包含该元素,则它保持不变
14、boolean removeLastOccurrence(Object o):从此双端队列中删除最后一次出现的指定元素。如果双端队列不包含该元素,则它保持不变。
15、boolean addAll(Collection<? extends E> c):将指定集合中的所有元素添加到此双端队列的末尾
16、E pop():从这个双端队列表示的堆栈中弹出一个元素(删除并返回此双端队列的第一个元素。)
17、void push(E e):如果可以在不违反容量限制的情况下立即将元素推送到此双端队列表示的堆栈上(在此双端队列的头部),则如果当前没有可用空间则IllegalStateException 。此方法等效于addFirst 。
18、boolean remove(Object o):从此双端队列中删除第一次出现的指定元素
19:boolean contains(Object o):如果此双端队列包含指定元素,则返回true
20、int size():返回此双端队列中的元素数
21、Iterator<E> iterator():以正确的顺序返回此双端队列中元素的迭代器。元素将按从第一个(头)到最后一个(尾)的顺序返回。
22、Iterator<E> descendingIterator():以相反的顺序返回此双端队列中元素的迭代器。元素将按从最后(尾)到第一个(头)的顺序返回。