Java中的队列有哪些,数据结构中的队列有哪些?

总结

1 概念:

FIFO 先进先出

备注:循环队列

队空:队头指针在队尾指针的下一位置时,队空: Q.front == Q.rear;
队满:(Q.rear+1)%MAXSIZE=Q.front ,
队满:当队头和队尾指针在同一位置时;
队列长度:(Q.rear - Q.front + MAXSIZE) % MAXSIZE

2 Java中的队列
阻塞队列

  • LinkedList:继承Deque
  • PriorityQueue:优先队列,使用的时最小堆的数据结构,对元素进行了指定排序,不许插入空值;实现了AbstractQueue抽象类和Queue接口
  • ConcurrentLinkedQueue:是基于链接节点的、线程安全的队列;实现了AbstractQueue抽象类和Queue接口

非阻塞队列

  • ArrayBlockingQueue :一个由数组支持的有界队列。
  • LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
  • PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
  • DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
  • SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

3 queue接口方法定义
2 Queue接口

详情

1 队列定义

队列(Queue):只允许在一端进行插入,而在另一端进行删除的线性表。
(1)允许删除的一端称为队头(Front)。
(2)允许插入的一端称为队尾(Rear)。
(3)当队列中没有元素时称为空队列。
(4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
在Java编程中,Queue的实现都是用LinkedList

Queue queue = new LinkedList();

2 Queue接口

Java中Queue是一个接口,具有以下方法:

操作 说明
boolean add(E e) 插入元素到队尾,若超出队列容量抛异常
boolean offer(E e) 插入元素到队尾,若超出队列容量返回false
E remove() 移除队头元素
E poll() 移除队头元素 ,若队列为空返回null
E element() 返回队头元素 ,若队列为空抛异常
E peek() 返回队头元素 ,若队列为空返回null

注意:
poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的

Queue接口

3 Queue的实现类

类图

queue

3.1 未实现BlockingQueue接口的非阻塞队列:

a.LinkedList(实现了java.util.Deque接口)

LinkedList有两个构造函数,一个空参,一个带有集合接口;
Deque接口是Queue接口的子接口,代表一个双端队列。同时Deque不仅可以作为双端队列使用,而且可以被当成栈来使用,所以可以使用出栈,入栈的方法。

b.PriorityQueue:优先队列 (实现了java.util.AbstractQueue抽象类和java.util.Queue接口)
优先队列本质是一个最小堆
PriorityQueue是个基于优先级堆的极大优先级队列。此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable),也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)

具体见源代码:

c.ConcurrentLinkedQueue(实现了java.util.AbstractQueue抽象类和java.util.Queue接口)
是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以在不必知道队列的大小时,     ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。

ConcurrentLinkedQueue

3.2.实现阻塞接口的队列

java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。
五个队列所提供的各有不同:

  • ArrayBlockingQueue :一个由数组支持的有界队列。
  • LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
  • PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
  • DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
  • SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
队列类图

ArrayBlockingQueue在构造时需要指定容量, 并可以选择是否需要公平性,如果公平参数被设置true,等待时间最长的线程会优先得到处理(其实就是通过将ReentrantLock设置为true来 达到这种公平性的:即等待时间最长的线程会先操作)。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队 列,此队列按 FIFO(先进先出)原则对元素进行排序。

LinkedBlockingQueue的容量是没有上限的(说的不准确,在不指定时容量为Integer.MAX_VALUE,不然的话在put时怎么会受阻呢),但是也可以选择指定其最大容量,它是基于链表的队列,此队列按 FIFO(先进先出)排序元素。

PriorityBlockingQueue是一个带优先级的队列,而不是先进先出队列。元素按优先级顺序被移除,该队列也没有上限(看了一下源码,PriorityBlockingQueue是对 PriorityQueue的再次包装,是基于堆数据结构的,而PriorityQueue是没有容量限制的,与ArrayList一样,所以在优先阻塞 队列上put时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError),但是如果队列为空,那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的。另外,插入该队列中的元素要具有比较能力。

DelayQueue(基于PriorityQueue来实现的)是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满,poll就以移除这个元素了。此队列不允许使用 null 元素。

集合框架图

你可能感兴趣的:(Java中的队列有哪些,数据结构中的队列有哪些?)