Deque是实现queue接口的双端队列
Deque的使用场景
在一般情况,不涉及到并发的情况下,有两个实现类,可根据其自身的特性进行选择,分别是:
- LinkedList 大小可变的链表双端队列,允许元素为插入null。
- ArrayDeque 大小可变的数组双端队列,不允许插入null。
- ConcurrentLinkedDeque 大小可变且线程安全的链表双端队列,非阻塞,不允许插入null。
- LinkedBlockingDeque 为线程安全的双端队列,在队列为空的情况下,获取操作将会阻塞,直到有元素添加。
注意:LinkedList 和 ArrayDeque 是线程不安全的容器。
Java中有Stack这个类,但是不推荐使用。通常使用Deque来完成队列和堆栈的功能。
Deque是个接口,其实现类有:
- ArrayDeque,使用“数组”存储数据
- LinkedList,使用“链表”存储数据
- ConcurrentLinkedDeque,线程安全的LinkedList
队列是一个典型的先进先出(FIFO)的容器。即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的。
队列的两种实现方式:
1: Deque<String> queue = new LinkedList<String>();
2: queue.offer("data1"); //队列尾部加入元素
3: queue.offer("data2");
4: queue.offer("data3");
5: System.out.println(queue.poll()); //取得队首元素,并从队列中删去
6:
7: Deque<String> stack = new LinkedList<String>();
8: stack.push("element1"); //向栈顶压入元素
9: stack.push("element2");
10: stack.push("element3");
11: System.out.println(stack.pop()); //取得栈顶元素,并从栈顶删去
1、offer()和add()的区别------------------入队
add()和offer()都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。可以据此在程序中进行有效的判断!
2、peek()和element()的区别-----------------------取队头
peek()和element()都将在不移除的情况下返回队头,但是peek()方法在队列为空时返回null,调用element()方法会抛出NoSuchElementException异常。
3、poll()和remove()的区别------------------------出队
poll()和remove()都将移除并且返回对头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。