Queue, Deque ,ArrayDeque
继承体系:
Queue
是队列的顶级接口,关注三个方法:
boolean offer(E e); ---入队 E poll(); ---队首元素出队并删除,队列为空则返回null E peek(); ---获取队首元素但不删除,队列为空则返回null
翻译一下类注释的几个关键讲解:
队列结构典型的但不是必须的,处理元素顺序的方式是FIFO,有2个例外:
priorityQueue,依据提供的comparator或者元素的自然顺序对元素排序
LIFO queue,就是将队列作为Stack使用时
不管是哪种排序方式,remove()和poll()方法永远是删除的队首元素
对于FIFO queue,新元素一定是插入到队尾
队列的实现类必须定义元素的排序方式
offer方法设计为当插入失败时返回false,而不是抛出异常,比如fixed-capacity 或者bounded queues
BlockingQueue也是Queue的一个实现类,但是Queue没有定义BlockingQueue的方法
通常情况下,Queue要求不允许插入null值,这是因为null作为一些方法的特殊返回值,比如poll和peek
通常情况下,Queue不会定义基于元素的equals和hashCode方法,代之的是直接继承元素类型的父类Object的equals和hashCode方法
因为基于元素自身重写的equals方法并不能很好的定义“相同元素但顺序不同”时的情形
Deque
双端队列
Queue的一个子类,是一个接口,双端对队列的实现类代表:基于链表实现的LinkedList,基于数组实现的ArrayQueue
以下是关于队首和队尾的12个操作方法,红线划掉的不需要关注
Deque也可以作为Stack使用,并且在选择时应优先于Stack类使用(Stack类是遗留类)
当作为Stack使用时,操作都是在队首(first),对应的等价方法如下:
ArrayDeque