概念:
FIFO:先入先出原则
一:queue方法
* 增: * add 增加一个元素 如果队列满了,抛出IIIegaISlabEepeplian异常 * offer 增加一个元素并返回true 如果队列满了,则返回false * put 增加一个元素 如果队列满了,则阻塞 * * 删: * remove 移除并返回队列头部的元素 如果队列为空,抛出NoSuchElementException异常 * poll 移除并返回队列头部的元素 如果队列为空,返回null * take 移除并返回队列头部的元素 如果队列为空,则堵塞 * * 查: * element 返回队列头部的元素 如果队列为空,抛出NoSuchElementException异常 * peek 返回队列头部的元素 如果队列为空,返回null * * drain To(list) 取出队列所有元素
二、队列特性:
队列主要分为阻塞和非阻塞,有界和无界、单向链表和双向链表之分。
* 非阻塞队列 * 1、ConcurrentLinkedQueue * 单向链表结构的无界并发队列, 非阻塞队列,由CAS实现线程安全,内部基于节点实现 * * 2、ConcurrentLinkedDeque * 双向链表结构的无界并发队列, 非阻塞队列,由CAS实现线程安全 * * 3、PriorityQueue * 内部基于数组实现,线程不安全的队列 * * 阻塞队列 * 1、DelayQueue * 一个支持延时获取元素的无界阻塞队列 * * 2、LinkedTransferQueue * 一个由链表结构组成的无界阻塞队列。 * * 3、ArrayBlockingQueue * 有界队列,阻塞式,初始化时必须指定队列大小,且不可改变,底层由数组实现; * * 4、SynchronousQueue * 最多只能存储一个元素,每一个put操作必须等待一个take操作,否则不能继续添加元素 * * 5、PriorityBlockingQueue * 一个带优先级的队列,而不是先进先出队列。元素按优先级顺序被移除,而且它也是无界的,也就是没有容量上限,虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError 错误;
实例:
package com.gao.test;
import java.util.LinkedList;
import java.util.Queue;
public class queue {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
//添加元素(用不抛出异常的方法)
queue.offer("a");
queue.offer("b");
//遍历打印队列queue
for (String q : queue) {
System.out.println(q);
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
//依然不用抛出异常的方法
System.out.println("poll = "+queue.poll()); //返回a,并移除队列中的a
//遍历打印队列queue
for (String q : queue) {
System.out.println(q);
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("peek = "+queue.peek()); //查看队列的第一个元素,不移除,队列中没有元素了会返回null
//遍历打印队列queue
for (String q : queue) {
System.out.println(q);
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println("remove = "+queue.remove()); //返回a,并移除队列中的a,如果元素没有,则抛出异常
//遍历打印队列queue
for (String q : queue) {
System.out.println(q);
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
try {
System.out.println("element = "+queue.element()); //查看队列的第一个元素,不移除,但队列没有元素会抛出异常
//遍历打印队列queue
for (String q : queue) {
System.out.println(q);
}
}catch (Exception e){
System.out.println("得到异常为:"+e);
}
}
}
打印结果: