type
status
date
slug
summary
tags
category
icon
password
Property
Queue
是队列,只能一头进,另一头出。如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque
。Java集合提供了接口
Deque
来实现一个双端队列,它的功能是:- 既可以添加到队尾,也可以添加到队首;
- 既可以从队首获取,又可以从队尾获取。
比较
Queue
和Deque
出队和入队的方法:对于添加元素到队尾的操作,
Queue
提供了add()
/offer()
方法,而Deque
提供了addLast()
/offerLast()
方法。添加元素到对首、取队尾元素的操作在Queue
中不存在,在Deque
中由addFirst()
/removeLast()
等方法提供。Deque
接口实际上扩展自Queue
:因此,
Queue
提供的add()
/offer()
方法在Deque
中也可以使用,但是,使用Deque
,最好不要调用offer()
,而是调用offerLast()
:如果直接写
deque.offer()
,我们就需要思考,offer()
实际上是offerLast()
,我们明确地写上offerLast()
,不需要思考就能一眼看出这是添加到队尾。因此,使用Deque
,推荐总是明确调用offerLast()
/offerFirst()
或者pollFirst()
/pollLast()
方法。Deque
是一个接口,它的实现类有ArrayDeque
和LinkedList
。我们发现
LinkedList
真是一个全能选手,它即是List
,又是Queue
,还是Deque
。但是我们在使用的时候,总是用特定的接口来引用它,这是因为持有接口说明代码的抽象层次更高,而且接口本身定义的方法代表了特定的用途。可见面向抽象编程的一个原则就是:尽量持有接口,而不是具体的实现类。