Queue介绍
美人如斯!
前言
队列是一种先进先出(FIFO)的数据结构,与生活中的排队类似,即先来先被服务,这样的特点决定了其具有一定的优先级含义,可以被用于任务调度等场景。队列模型如图:
图1.队列模型
java中的Queue
1.接口类Queue
java中通过定义Queue接口类及一系列行为来描述队列。队列的操作一般包括:出队和入队,Queue接口针对这些操作定义了三种行为:
- 插入:入队,向队列插入一个元素;
- 移除:出队,从队列中移除一个元素;
- 检查:从队列中获取一个元素,但是不移除;
其中每种行为又分为两种形式:
- 快速失败(fail-fast),立即抛出异常
- 返回特定的值,根据实现的不同,返回
null
或者false
Queue的UML类图如下:
图2.Queue UML图
- add(): 向队列中增加一个元素,如果队列已满,将抛出IllegalStateException异常,增加成功,返回true;
- offer(): 同add操作很类似,都是向队列中插入元素,区别在于,如果队列已满时,插入返回false;
- remove(): 获取并移除队列头部的元素,如果队列是空,将抛出NoSuchElementException异常;
- poll(): 同remove操作很类似,区别在于,如果队列是空,将返回null;
- element(): 获取但不移除队头元素,如果队列是空,将抛出NoSuchElementException异常;
- peek(): 同element操作很类似,区别在于,如果队列是空,返回null;
2.实现
Queue的实现种类繁多,不同的实现有不同的应用场景。先通过总结性的概括下其繁杂的种类,然后再分析些常见的队列。
根据以上UML图可以看出,根据不同的特点,Queue大致可以分为三种类型:
Queue的UML类图如下:
图2.Queue UML图
- Queue的直接实现
- Deque双向队列:队头和队尾均能进行入队和出队操作
- BlockingQueue阻塞队列:阻塞式队列,某些出队和入队操作会阻塞