Queue 队列分析(单向队列,双向队列,阻塞队列)

本文深入解析了Java中的队列实现,包括Queue、BlockingQueue、Deque和BlockingDeque的概念、特性和操作方法,详细比较了它们之间的区别,并介绍了如何在实际应用中选择合适的队列结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Queue extends Collection 队列实现了 Collection 接口,Collection接口是集合类的顶级接口,提供了一些对集合通用的操作方法,最常见的 add(增) ,remove(删),,size(查询)

 下面就一点一点分析继承实现关系。

Queue 队列,顾名思义是一个以队列结构存储的容器,与Collection设计不同的是,它有两种状态,第一种他会对操作失败抛出异常来打断操作(比如add()操作时,如果超过队列的容量是将抛出异常),第二种就是正常操作不会抛出异常的。

 抛异常Special value
插入add()offer()
删除remove()pull()
修剪element()peek()

修剪和删除的区别是,删除会返回对象并把它从容器内移除,修剪是只会返回对象不会删除, 还有就是如果集合里没有元素了,调用remove,或element 会抛出异常,而调用

pull, peek 只会返回空,不会抛出异常。


BlockingQueue extends Queue 阻塞队列,出了继承自Queue,他还定义了自己的一些方法,出了父类的,主要还有阻塞操作,和超时操作

 抛异常Special value阻塞超时
插入add(e)offer(e)put(e)offer(e, time, unit)
删除remove()poll()take()poll(time, unit)
修剪element()peek()not applicablenot applicable

put()  插入 当容器容量满了时,调用put()方法,调用者现成将被阻塞住wait,一直到其他线程消耗了容器里一个元素,阻塞住的线程才会被唤醒,执行插入的操作

take() 删除 同理,当容器类没有元素时,执行take()方法将会被wait住,直至容器内有元素才会被唤醒,在执行删除操作。

offer(e, time, unit) 插入,和put()方法一样,会阻塞,只不过提供了打断等待线程的时间参数,在指定的传入的时间内,没有没有被唤醒,该线程将被打断等待,抛 出InterruptedException 异常。

poll(time, unit) (拉出一个元素来,hehe...)同take()一样会阻塞,它会在传入的指定时间内,没有被唤醒,该线程将被打断等待,抛 InterruptedException 异常。


Deque extends Queue (double ended queue 的缩写)双向队列,设计为一个线性存储机构的容器,继承自Queue接口,除了Queue父类的一般操作外,它还提供了对头和队尾的一些操作:


第一元素 (头)第二元素(Tail)

抛异常Special value抛异常Special value
插入addFirst(e)offerFirst(e)addLast(e)offerLast(e)
删除removeFirst()pollFirst()removeLast()pollLast()
修剪getFirst()peekFirst()getLast()peekLast()

有以下两种情况,如果Deque被用作FIFO(First in First out)先进先出的结构队列,它对应的Queue操作方法如下:

Queue 方法等价于 Deque 方法
add(e)addLast(e)
offer(e)offerLast(e)
remove()removeFirst()
poll()pollFirst()
element()getFirst()
peek()peekFirst()

 

Deque也可被用作LIFO(Last in First out)后进先出的结构stack ,当一个Deque 被用作一个stack时,它对应的压栈和弹栈操作方法如下:

Stack 方法等价于 Deque 方法
push(e)addFirst(e)
pop()removeFirst()
peek()peekFirst()


BlockingDeque extends BlockingQueue, Deque 阻塞的双向队列,定义了一个操作阻塞的双向队列(有点绕口),具体介绍参照父类的定义,一些方法介绍如下:

First Element (Head)
 抛异常Special value阻塞超时
插入addFirst(e)offerFirst(e)putFirst(e)offerFirst(e, time, unit)
删除removeFirst()pollFirst()takeFirst()pollFirst(time, unit)
修剪getFirst()peekFirst()not applicablenot applicable
Last Element (Tail)
 抛异常Special value阻塞超时
插入addLast(e)offerLast(e)putLast(e)offerLast(e, time, unit)
删除removeLast()pollLast()takeLast()pollLast(time, unit)
修剪getLast()peekLast()not applicablenot applicable
绝提介绍参照BlockingQeque, Deque接口。

对BlockQueue 的方法对应如下表:

BlockingQueue 方法等价于BlockingDeque 方法
插入
add(e)addLast(e)
offer(e)offerLast(e)
put(e)putLast(e)
offer(e, time, unit)offerLast(e, time, unit)
移除
remove()removeFirst()
poll()pollFirst()
take()takeFirst()
poll(time, unit)pollFirst(time, unit)
修剪
element()getFirst()
peek()peekFirst()


写这么多还是有点乱,总结下吧:

插入系列

addXXX  :插入不成功 抛出异常

offerXXX:插入不成功返回false,否则返回true

putXXX:插入不成功,阻塞线程

offerXXX(xx,xx,xx):插入不成功,阻塞一定时间后被打断


删除系列

removeXXX:删除不成功 抛出异常

pollXXX:删除不成功返回false,否则返回true

takeXXX:删除不成功,阻塞线程

pollXXX(xx,xx,xx) :删除不成功,阻塞一定时间后被打断

 

修剪:

element() ==getFirst()或 getXXX(): 返回队头或队尾的元素,无则抛出异常

peekXXX():返回队头或队尾元素,无 则返回null


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值