队列总结(一)

Queue

Queue接口定义了一个队列必须满足的基本特性,队列作为一个容器,自身继承了Collection接口,同时满足容器的特征。

public interface Queue<E> extends Collection<E> {}

在这里插入图片描述
Queue实现通常不允许插入null元素,尽管某些实现(例如LinkedList )不禁止插入null 。即使在允许null的实现中,也不应将null插入到Queue ,因为null也被poll方法用作特殊的返回值,以指示队列不包含任何元素。

队列通常(但不一定)以 FIFO(先进先出)方式对元素进行排序。但也有不少例外,如优先级队列PriorityQueue,它根据提供的比较器或元素的自然顺序对元素进行排序,再如对元素进行 LIFO(后进先出)排序的 LIFO 队列(或称为堆栈)

队列还提供额外的插入、提取和检查操作。 这些方法中的每一个都以两种形式存在:一种在操作失败时抛出异常,另一种返回一个特殊值( null或false ,取决于操作)。 后一种形式的插入操作是专门为与容量受限的Queue实现一起使用而设计的; 在大多数实现中,插入操作不会失败。

抛出异常返回特殊值
插入addoffer
移除removepoll
检索elementpeek
/**
 * offer方法指定,如果可不违反容量限制(有界队列),立即将指定元素插入此队列。 否则直接返回false。(add方法会抛出异常)
 */
boolean offer(E e);

/**
 * 注意区别于Collection接口中的 boolean remove(Object o)方法
 * 检索并删除此队列的头部。 此方法与poll不同之处仅在于,如果此队列为空,它会引发NoSuchElementException异常。
 * 返回该队列的头元素
 */
E remove();

/**
 * 检索并移除此队列的头部,如果此队列为空,则返回null 。
 * 注意,如果该队列(如LinkedList)支持null元素,那么也可能返回null(尽管可能,但是最好不要如此)
 */
E poll();

/**
 * 检索但不删除此队列的头部。 如果此队列为空,它会引发异常。
 */
E element();

/**
 * 检索但不删除此队列的头部。 如果此队列为空,返回空。
 */
E peek();

介绍完基本的队列属性后,再看一些常用的队列扩展

BlockingQueue

阻塞队列,额外支持在检索元素时等待队列变为非空的操作,并在存储元素时等待队列中的空间变为可用。BlockingQueue可能有容量限制,默认容量为Integer.MAX_VALUE,通过remainingCapacity方法可以获取队列当前剩余容量。

public interface BlockingQueue<E> extends Queue<E> {}

BlockingQueue实现是线程安全的。 所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果
但是,Collection中多元素操作的方法如addAll不能保证原子性,因为可能在插入部分元素而达到最大容量后,剩余元素无法插入而抛出异常的情况。

BlockingQueue方法有四种形式,处理不能立即满足但可能在未来某个时候满足的操作的方式各不相同:一个抛出异常,第二个返回一个特殊值( null或false ,取决于操作),第三个无限期地阻塞当前线程,直到操作成功,第四个阻塞仅给定的最大时间限制,然后放弃。
在这里插入图片描述

抛出异常返回特殊值阻塞超时
插入add(e)offer(e)put(e)offer(e,time,unit)
移除remove()poll()take()poll(time,unit)
检索elementpeek不适用不适用
boolean offer(E e, long timeout, TimeUnit unit)throws InterruptedException;

E poll(long timeout, TimeUnit unit) throws InterruptedException;

/**
 * 检索并删除此队列的头部,如果此队列为null,则一直阻塞直到队列中插入了元素
 */
E take() throws InterruptedException;

/**
 * 将指定元素插入队列,如果队列有界且此时无可插入位置,则一直阻塞直到队列可插入
 */
void put(E e) throws InterruptedException;

Deque

双端队列,顾名思义,注重于头尾元素,扩展了许多针对头尾的操作方法。此接口支持容量受限的双端队列以及没有固定大小限制的双端队列。

该接口定义了访问双端队列两端元素的方法。 提供了插入、删除和检查元素的方法。 这些方法中的每一个都以两种形式存在:一种在操作失败时抛出异常,另一种返回一个特殊值( null或false ,取决于操作)。 后一种形式的插入操作是专门为与容量受限的Deque实现一起使用而设计的。
在这里插入图片描述
该接口扩展了Queue接口。 当双端队列用作队列时,会产生 FIFO(先进先出)行为, 元素添加在双端队列的末尾并从开头删除。 从Queue接口继承的方法与Deque方法完全等效,如下表所示
在这里插入图片描述
双端队列也可以用作 LIFO(后进先出)堆栈。 应优先使用此接口而不是遗留Stack类。 当双端队列用作堆栈时,元素从双端队列的开头被压入和弹出。 堆栈方法与Deque方法完全等效,如下表所示:
在这里插入图片描述
该接口提供了两种移除内部元素的方法, removeFirstOccurrence和removeLastOccurrence 。
与List接口不同,该接口不支持对元素进行索引访问。

public interface Deque<E> extends Queue<E> {}

在这里插入图片描述

BlockingDeque

阻塞式双端队列,同时继承了上面的两个接口

public interface BlockingDeque<E> extends BlockingQueue<E>, Deque<E> {}

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

对于各个接口的常用实现,还是放在另外的文章中去记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值