java集合 Queue队列

Java中的Queue是一个FIFO(先进先出)的数据结构,主要分为普通队列、双端队列和阻塞队列。实现包括ConcurrentLinkedQueue、PriorityQueue、ArrayDeque等。阻塞队列如ArrayBlockingQueue、LinkedBlockingQueue等在多线程环境下提供高效并发,当队列满或空时,操作会阻塞。
摘要由CSDN通过智能技术生成

Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构

Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。

Queue的实现

Queue的实现在Java中主要有三种,即:

1.普通的队列其又分为了队列和堆(优先级队列)

2.双端队列Deque

3.阻塞队列:最为有名的队列实现。

img 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞(这就需要使用到锁)。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.

非阻塞队列:

1.ConcurrentLinkedQueue, (基于链表的并发队列)

 

 

实现:是基于节点Node的单向链表来实现的、线程安全的队列。其中的大多数属性和节点被volatile所修饰,并发访问不需要同步。

优点:它在队列的尾部添加元素并从头部删除它们,所以不需要知道队列的大小,ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。

缺点:收集关于队列大小的信息会很慢,需要遍历队列。

是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。该队列不允许null元素。

ConcurrentLinkedQueue重要方法:

Add()和offer()都是加入元素的方法(在ConcurrentLinkedQueue中,这两个方法投有任何区别)

Poll()和peek()都是取头元素节点,区别在于前者会删除元素,后者不会

2.PriorityQueue, (优先级队列)

Priority queue represented as a balanced binary heap: the two* children of queue[n] are queue[2*n+1] and queue[2*(n+1)].

实现:底层为一个Obj数组,其为采用数组存储的堆结构。

PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。

 

 

双端队列:

1.ArrayDeque, (数组双端队列)Deque 双端队列 Deque允许在队列的头部活尾部都可以进行出队和入队操作。

特点:队列维护了一个head哨兵,队列维护了一个tail哨兵

 

 

阻塞队列:

2)实现阻塞接口的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值