4.6 Queue接口
Queue就是队列,除了基本的Collection操作外,Queue接口还提供额外的插入、删除和检查等操作。Queue接口定义如下:
每个Queue方法都有两种形式,在操作失败时,要么抛出异常,要么返回特殊值(比如null或false,具体取决于操作)。接口的常规结构如表4-2所示。
表4-2 Queue接口结构
Queue通常以FIFO(先进先出)方式对元素进行排序,但也有例外,比如(优先级队列)。PriorityQueue根据元素的值对元素进行排序。无论使用什么排序,队列的头部都是通过调用remove或poll移除的元素。在FIFO队列中,所有新元素都插入队列的尾部。其他类型的队列可能使用不同的放置规则,但每个Queue实现都必须指定其排序属性。
Queue接口的实现可以限制它所拥有的元素数量,那么这样的队列被称为有界。java.util.concurrent中的某些Queue实现是有界的,但也有一些Queue的实现是无界的。
Queue从Collection继承的add方法用于插入一个元素,除非它违反了队列的容量限制,在这种情况下它会抛出IllegalStateException。offer方法仅用于有界队列,与add的不同之处仅在于它通过返回false来表示插入元素失败。
remove和poll方法都移除并返回队列的头部。仅当队列为空时,remove和poll方法的行为才有所不同。在这种情况下,remove抛出NoSuchElementException,而poll返回null。
element和peek方法返回但不移除队列的头部,它们之间的差异与remove和poll的方式完全相同:若队列为空,则element抛出NoSuchElementException,而peek返回null。
队列实现通常不允许插入null元素,为实现Queue而进行了改进的LinkedList实现是一个例外,由于历史原因,它允许null元素,但是开发者应该避免利用它,因为null被poll和peek方法用作特殊的返回值。