Java集合之队列

集合之队列

JDK两套队列:

  • 以ConcurrentLinkedQueue为代表的高性能非阻塞队列
    无界队列,不允许null,无锁采用CAS算法实现
  • 以BlockingQueue为代表的阻塞队列
    当生产者向队列添加元素但队列已满时,生产者会阻塞;当消费者从队列中移除元素但对列为空时候,消费者被阻塞。

为什么要使用阻塞队列?
消费者和生产者不会保持相同的速度,如生产者快时候,队列会越来越大,相比之下,阻塞队列只允许生产者的速度在一定速度上超过消费者的速度,但不会超过很多。

常见队列

LinkedBlockingQueue:
基于链表的无界阻塞队列,但也可以指定长度,不指定无界,内部维护了一个链表缓存队列,实现了读写分离(读写两个锁)
SynchronousQueue:
没有缓冲的队列,生产者的数据直接被消费者消费,add方法必须在take方法之后调用,否则会抛异常,add只是将数据直接丢给阻塞等待的线程而并非直接向队列里添加数据
ProrityDueue:
基于优先级的无阻塞队列,(优先级是通过构造函数传入的Compator对象来决定的)
DelayQueue:
带有延迟时间的无界阻塞队列,其中的元素只有延迟时间到了才能从队列中获取数据,其中元素接口必须实现Delayed接口,根据集合元素的getDalay()方法的返回值进行排序。底层基于PriorityBlockingQueue实现。
TransferQueue:
生产者会一致阻塞直到所添加到队列的元素被某一个消费者所消费,新添加的transfer方法用来实现这种约束。阻塞就是发生在元素从一个线程transfer到另一个线程的过程中,它有校的实现元素在线程之间的传递。

Queue

Queue用于模拟队列这种数据结构,队列通常是先进先出的容器,新元素插入(offer)到队列的尾部,访问元素(poll)返回队列的头元素。Queue接口有一个PriorityQueue实现类,除此之外还有一个Deque接口,而Deque有ArrayDeque和LinkedList类实现,下面详细讲这几个。
1、没有实现的阻塞接口的LinkedList,内置的不阻塞队列

  • PriorityQueue 实际上维护了一个有序列表
  • ConcurrentlinkedQueue 基于链接节点的线程安全的队列,并发访问不需要同步。

2、 实现阻塞的接口

  • ArrayBlockingQueue 数组支持的有届队列
  • LinkedBlockingQUeue 链接节点支持的可选有届队列
  • PriorityBlockingQueue 一个由优先级堆支持的无届优先级队列
  • DelayQUeue 有优先级堆支持的,基于时间的调度队列
  • SynchronousQueue 利用BlockingQueue 接口的简单聚集机制

Queue主要定义的方法

  • offer(Object o):将元素加入队列的尾部;
  • Peek():获取队列头部元素,不删除该元素,如果此队列为空,返回null
  • poll():获取队列头部元素,删除该元素,如果此队列为空,返回null

ProrityDueue

ProrityDueue保存队列的顺序是按照队列元素的大小进行重新排序,因此调用poll()方法取出队列元素,不允许插入null元素

Deque接口和ArrayDeque实现类

Deque接口是Queue接口的子接口,代表一个双端队列,允许从两边操作队列(可以当作栈来使用),pop(出栈),push(入栈)两个方法
LinkedList也实现了Deque接口,所以也可以当作栈来使用,两者区别如下:
ArrayDeque内部是数组形式来保存集合的元素,随机访问时候性能较好,LinkedList内部是链表形式,随机访问较差,但插入、删除时候性能较好

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值