Queue
596字约2分钟
2024-08-08
队列(Queue
)是一种经常使用的集合。Queue
实际上是实现了一个先进先出(FIFO:First In First Out
)的有序表。它和 List
的区别在于,List
可以在任意位置添加和删除元素,而 Queue
只有两个操作
把元素添加到队列末尾
从队列头部取出元素
在Java的标准库中,队列接口 Queue
定义了以下几个方法
int size()
:获取队列长度boolean add(E)
/boolean offer(E)
:添加元素到队尾E remove()
/E poll()
:获取队首元素并从队列中删除E element()
/E peek()
:获取队首元素但并不从队列中删除
对于具体的实现类,有的 Queue
有最大队列长度限制,有的 Queue
没有。注意到添加、删除和获取队列元素总是有两个方法,这是因为在添加或获取元素失败时,这两个方法的行为是不同的
throw Exception | 返回false或null | |
---|---|---|
添加元素到队尾 | add(E e) | boolean offer(E e) |
取队首元素并删除 | E remove() | E poll() |
取队首元素但不删除 | E element() | E peek() |
poll() 和 peek()
注意:不要把 null
添加到队列中,否则 poll()
方法返回 null
时,很难确定是取到了 null
元素还是队列为空
每次调用 poll()
,都会获取队首元素,并且获取到的元素已经从队列中被删除了
public static void main(String[] args) {
Queue<String> q = new LinkedList<>();
// 添加3个元素到队列:
q.offer("apple");
q.offer("pear");
q.offer("banana");
// 从队列取出元素:
System.out.println(q.poll()); // apple
System.out.println(q.poll()); // pear
System.out.println(q.poll()); // banana
System.out.println(q.poll()); // null,因为队列是空的
}
如果用 peek()
,因为获取队首元素时,并不会从队列中删除这个元素,所以可以反复获取
public static void main(String[] args) {
Queue<String> q = new LinkedList<>();
// 添加3个元素到队列:
q.offer("apple");
q.offer("pear");
q.offer("banana");
// 队首永远都是apple,因为peek()不会删除它:
System.out.println(q.peek()); // apple
System.out.println(q.peek()); // apple
System.out.println(q.peek()); // apple
}
LinkedList
即实现了 List
接口,又实现了 Queue
接口,但是,在使用的时候,如果我们把它当作 List
,就获取 List
的引用,如果我们把它当作 Queue
,就获取 Queue
的引用
// 这是一个List:
List<String> list = new LinkedList<>();
// 这是一个Queue:
Queue<String> queue = new LinkedList<>();