Queue:
按照添加的顺序排列,FIFO(先进先出)。
通常队列使用两个方法:offer、poll。因为如果存放或者获取失败,返回false或者null(这种情况下不要往容器中添加null),而不是抛异常(异常很讨厌额^_^)
线程不安全的队列
-
LinkedList
--implemets Deque
由于实现了双端队列的接口,所以“LinkedList is a Queue”。可以将其当做一个队列来使用(同样可以使用offer、poll方法)。但是它是线程不安全的。 - PriorityQueue
特点是有序的,每添加一个元素会按照排序规则重新排序。如何定义排序规则呢?第一种,使用默认的排序规则,即元素实现Comparable接口中的compareTo方法;第二种,使用容器自身的排序规则,初始化时传入一个Comparator,
实现该接口的compare方法。compare的优先级高于compareTo。
线程安全的队列
- ConcurrentLinkedQueue
位于jdk1.5出的concurrent包下,所以这个类是线程安全的,依赖CAS机制实现(compareAndSwap:取出当前值,然后与预期值比较,如果一致,用更新值替换当前值,这一连串操作是原子操作,来源于CPU指令集)。
属于非阻塞队列,相对于阻塞的队列来说,效率要高一些。 - LinkedBlockingQueue
位于jdk1.5出的concurrent包下,所以这个类是线程安全的,依赖Reentrant锁来实现。
属于阻塞队列(使用put、take方法,如果队列已满或者已空,则一直阻塞下去)。
属于无界队列(理论上来说是最大值为Integer.MAX_VALUE)
concurrent包下的5个阻塞对列
- ArrayBlockingQueue :一个由数组支持的有界队列。
- LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
- PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
- DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
- SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
区分队列的相关集合的特点貌似有点儿困难,但是只要记住这几条黄金法则即可
- 看到array就要想到有界
- 看到linked就要想到first、last、无界
- 看到bloking就要想到阻塞(阻塞的两个方法put、take)
- 看到priorit就要想到两个接口:Comparable和Comparator
队列中几种操作
- add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
- remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
- element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
- offer 添加一个元素并返回true 如果队列已满,则返回false
- poll 移除并返问队列头部的元素 如果队列为空,则返回null
- peek 返回队列头部的元素 如果队列为空,则返回null
- put 添加一个元素 如果队列满,则阻塞
- take 移除并返回队列头部的元素 如果队列为空,则阻塞