0.前言
在数据结构与算法中,队列是被经常使用的一种数据结构,总体上构成较为简单,但是Java在实际使用时易用错,经常会。比如 poll() 方法,add() 方法,offer() 方法,addFirst()方法,removeFirst()方法,removeLast() 方法,它们之间的对应关系是怎么样的,Queue和Deque使用和功能有何不同?本文主要探究这些问题。
1.队列这种数据结构
作为一种经典的数据结构,栈承担了先进后出的责任,而在先进先出这方面,则由队列来完成。队列有单向队列,即最经典的队列,一头进,另一头出,而双端队列,两端都可以进出,比较灵活,所以造成了双端队列的api较多,在实际使用中经常会搞错方向。
还有就是队列的头尾问题,分不清很容易在双端队列的removeFirst()方法或者是removeLast()方法中混淆。队列中的元素从哪边出去就是队列头,双端队列中两边都可以出去,但是沿着元素进入的方向能走出队列的一端为头。
需要注意的是,队列是操作受限的线性表,所以,不是任何对线性表的操作都可以作为队列的操作。比如,不可以随便读取队列中间的某个数据。【3】
关于队列的结构还可参考这篇文章,有助于理解:
2.Java Queue
在Java中,Queue是队列的接口,主要的方法有6个,比较简单。常用的实现类有两个:LinkedList<>()和ArrayDeque<>()。
官方文档:
1.add() 方法
添加元素到队尾
2.element()方法
查看队首元素
3.offer()方法
添加元素到队尾,和add()作用相同。队列有大小限制,在一个满的队列中加入一个新项,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false,因此就可以在程序中进行有效的判断。【1】
4.peek()方法
查看队首元素,和peek()相同。队列为空, element()方法会抛出一个异常,peek() 返回 null。
5.poll()方法
删除队首元素
6.remove()方法
删