【JAVA】【集合16】Java中的Queue接口
一、Queue定义
队列(queue)是一组有序的元素,提取元素时按顺序 从队头读取 。队列一般 按照插入元素的顺序 实现可分成两类:
-
先进先出(first-in, first-out,FIFO)队列
-
后进先出(last-in, first-out,LIFO)队列
其中,LIFO 队列也叫栈(stack)。Java 提供了 Stack 类,但强烈不建议使用 Stack 类,建议使用使用 Queque 接口的实现类。
Queue与List、Set的区别:
-
与 List 不同的是:Queue 接口没有定义处理任意 索引位 元素的方法,只有队列的头一个元素能访问。
-
与 Set 不同的是:Queue 的实现往往 允许出现重复 的元素。
Queue的所有实现都要具有一个固定的容量:
-
队列已满时,不能再添加元素。
-
队列为空时,不能再删除元素。
-
基于队列的算法都会用到 满 和 空 这两个状态,所以 Queue 接口的方法通过返回值表明这两个状态,而不会抛出异常。具体而言,peek() 和 poll() 方法返回 null 表示队列为空,因此,多数 Queue 接口的实现不允许用 null 作元素。
队列也可以使用其他顺序,如:
- 优先队列(priority queue)根据外部 Comparator 对象或 Comparable 类型元素的自然顺序排序元素。
阻塞式队列(blocking queue): 是一种定义了阻塞式 put() 和 take() 方法的队列。
- put() 方法的作用是把元素添加到队列中。阻塞式队列中,如果需要,这个方法会一直等待,直到队列中有存储元素的空间为止。
- 而 take() 方法的作用是从队头移除元素。阻塞式队列中,如果需要,这个方法会一直等待,直到队列中有元素可供移除为止。
- 阻塞式队列是很多多线程算法的重要组成部分,因此 BlockingQueue 接口(扩展 Queue 接口)在 java.util.concurrent 包中定义。
Queue接口在java.util.Queue包中定义,如下:
public interface Queue<E> extends Collection<E>
二、常用方法
1. 添加元素
boolean add(E e);
向队列中添加指定元素。对于有界队列,成功时返回true,如果当前没有可用空间,则抛出非法状态异常。
boolean offer(E e);
向队列中添加指定元素。对于有界队列,由于有界的队列已满而无法添加元素时,这个方法返回 false,而不会抛出异常。
2. 提取元素
E remove();
移除并返回队头的元素。如果队列为空,这个方法会抛出 NoSuchElementException 异常。
E poll();
作用和 remove() 方法类似,移除并返回队头的元素, 不过,如果队列为空,这个方法会返回 null,而不抛出异常。
E element();
其作用是返回队头的元素,但不将其从队列中移除。如果队列为空,这个方法抛出 NoSuchElementException 异常。
E peek();
作用和 element() 方法类似,但队列为空时,返回 null;