网站备案 教程,网站建设公司 跨界鱼科技专业,会展网站模板,合肥市网站建设公司Deque
我们知道#xff0c;Queue是队列#xff0c;只能一头进#xff0c;另一头出。
如果把条件放松一下#xff0c;允许两头都进#xff0c;两头都出#xff0c;这种队列叫双端队列#xff08;Double Ended Queue#xff09;#xff0c;学名Deque /dek/。
Java集合…Deque
我们知道Queue是队列只能一头进另一头出。
如果把条件放松一下允许两头都进两头都出这种队列叫双端队列Double Ended Queue学名Deque /dek/。
Java集合提供了接口Deque来实现一个双端队列它的功能是
既可以添加到队尾也可以添加到队首既可以从队首获取又可以从队尾获取。
我们来比较一下Queue和Deque出队和入队的方法
QueueDeque添加元素到队尾add(E e) / offer(E e)addLast(E e) / offerLast(E e)取队首元素并删除E remove() / E poll()E removeFirst() / E pollFirst()取队首元素但不删除E element() / E peek()E getFirst() / E peekFirst()添加元素到队首无addFirst(E e) / offerFirst(E e)取队尾元素并删除无E removeLast() / E pollLast()取队尾元素但不删除无E getLast() / E peekLast()
对于添加元素到队尾的操作Queue提供了add()/offer()方法而Deque提供了addLast()/offerLast()方法。添加元素到队首、取队尾元素的操作在Queue中不存在在Deque中由addFirst()/removeLast()等方法提供。
注意到Deque接口实际上扩展自Queue
public interface DequeE extends QueueE {...
}因此Queue提供的add()/offer()方法在Deque中也可以使用但是使用Deque最好不要调用offer()而是调用offerLast()
import java.util.Deque;
import java.util.LinkedList;如果直接写deque.offer()我们就需要思考offer()实际上是offerLast()我们明确地写上offerLast()不需要思考就能一眼看出这是添加到队尾。
因此使用Deque推荐总是明确调用offerLast()/offerFirst()或者pollFirst()/pollLast()方法。
Deque是一个接口它的实现类有ArrayDeque和LinkedList。
我们发现LinkedList真是一个全能选手它即是List又是Queue还是Deque。但是我们在使用的时候总是用特定的接口来引用它这是因为持有接口说明代码的抽象层次更高而且接口本身定义的方法代表了特定的用途。
// 不推荐的写法:
LinkedListString d1 new LinkedList();
d1.offerLast(z);
// 推荐的写法
DequeString d2 new LinkedList();
d2.offerLast(z);可见面向抽象编程的一个原则就是尽量持有接口而不是具体的实现类。
小结
Deque实现了一个双端队列Double Ended Queue它可以
将元素添加到队尾或队首addLast()/offerLast()/addFirst()/offerFirst()从队首队尾获取元素并删除removeFirst()/pollFirst()/removeLast()/pollLast()从队首队尾获取元素但不删除getFirst()/peekFirst()/getLast()/peekLast()总是调用xxxFirst()/xxxLast()以便与Queue的方法区分开避免把null添加到队列。