玖叶教程网

前端编程开发入门

Queue解析

01概述

队列(Queue):一种只允许在一端进行插入,在另一端进行删除的线性表结构。运行插入的一端叫队尾,允许删除的一端叫队头,与LIFO 的栈不同,队列是一种FIFO表。Queue接口与List、Set同一级别,都是继承了Collection接口。

队列的底层结构只有两种, 数组Array, 链表Linked。

但是呢,数组是比链表快的,因为数组内元素的内存地址是连续的。而且数组的容量是有限的, 相对来说发生内存溢出的风险会小很多。

实现一个队列,选择存储结构的优先级是:Linked < Array。

02正文

非阻塞队列:PriorityQueue 和 ConcurrentLinkedQueue

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

ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小,ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。

实现阻塞接口的队列

五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。

ArrayBlockingQueue:一个由数组支持的有界队列。

LinkedBlockingQueue:一个由链接节点支持的可选有界队列。

PriorityBlockingQueue:一个由优先级堆支持的无界优先级队列。

DelayQueue:一个由优先级堆支持的、基于时间的调度队列。

SynchronousQueue:一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

双端队列

LinkedList:大小可变的链表双端队列,允许元素为插入null。

ArrayDeque:大小可变的数组双端队列,不允许插入null。

ConcurrentLinkedDeque:大小可变且线程安全的链表双端队列,非阻塞,不允许插入null。

LinkedBlockingDeque:为线程安全的双端队列,在队列为空的情况下,获取操作将会阻塞,直到有元素添加。

注意:LinkedList 和 ArrayDeque 是线程不安全的容器。

ArrayDeque是个可变数组,它是在Java 6之后新添加的,而LinkedList是一种链表结构的list。LinkedList要比ArrayDeque更加灵活,因为它也实现了List接口的所有操作,并且可以插入null元素,这在ArrayDeque中是不允许的。

END

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言