深入理解Queue接口的本质

375 阅读2分钟

「这是我参与 11 月更文挑战的第 9 天,活动详情查看:2021最后一次更文挑战」。

大家好,我是悟空哥。 我们来看下 Queue 接口的本质。

  • Queue接口是一种Collection,被设计用于处理之前临时保存在某处的元素。
  • 除了基本的Collection操作之外,队列还提供了额外的插入、提取和检查操作。每一种操作都有两种形式:如果操作失败,则抛出一个异常;如果操作失败,则返回一个特殊值(null或false,取决于是什么操作)。
  • 队列通常是以FIFO(先进先出)的方式排序元素,但是这不是必须的。
  • 只有优先级队列可以根据提供的比较器对元素进行排序或者是采用正常的排序。无论怎么排序,队列的头将通过调用remove()或poll()方法进行移除。在FIFO队列种,所有新的元素被插入到队尾。其他种类的队列可能使用不同的布局来存放元素。
  • 每个Queue必须指定排序属性。

Queue接口的核心方法

总共有3组方法,每一组方法对应两个方法。如下图所示:

动作抛异常返回特殊值
Insertadd(e)offer(e)
Removeremove()poll
Examineelement()peek()
  • (1)比如添加(Insert)元素的动作,会有两种方式:add(e)offer(e)。如果调用add(e)方法时,添加失败,则会抛异常,而如果调用的是offer(e)方法失败时,则会返回false。offer方法用于异常是正常的情况下使用,比如在有界队列中,优先使用offer方法。假如队列满了,不能添加元素,offer方法返回false,这样我们就知道是队列满了,而不是去handle运行时抛出的异常。
  • (2)同理,移除(Remove)元素的动作,队列为空时,remove方法抛异常,而poll返回null。如果移除头部的元素成功,则返回移除的元素。
  • (3)同理,检测(Examine)元素的动作,返回头部元素(最开始加入的元素),但不删除元素, 如果队列为空,则element()方法抛异常,而peek()返回false。
  • (4)Queue接口没有定义阻塞队列的方法,这些方法在BlockQueue接口中定义了。
  • (5)Queue实现类通常不允许插入null元素,尽管一些实现类比如LinkedList不禁止插入null,但是还是不建议插入null,因为null也被用在poll方法的特殊返回值,以说明队列不包含元素。