Queue实现Collection接口,是存放一组待数据的集合,和LinkedList功能几乎一样。既然和LinkedList功能一样那么为什么还需要Queue类呢?圣经给我的答案:是去掉List的随机访问功能,从而提高高效并发能力。

Queue接口常用的一个实现是ConcurrentLinkedQueue,它的特点是无界,不堵塞,一个实现先进先出的队列。个人觉得线上应该尽量少使用,很容易造成内存溢出。还有个一个实现是 PriorityBlockingQueue队列,他是一个优先级队列。优先级队列存放的对象,必须是实现Comparable接口,并重写compareTo 方法。有趣的是PriorityBlockingQueue只有在使用take(取数据)方法是才去排序。个人觉得这是一种延时的设计,提高添加数据的性能。

BlockingQueue是拓展Queue了接口,扩展可堵塞添加(put)和获取(take)数据的方法,同时扩展可定时添加(offer)和获取(poll)数据的方法。

因为BlockingQueue继承Queue接口,而Queue又继承Collection,所以造成部分冗余的API,很容易混淆。

offer,put,add方法的区别

如果是堵塞队列,那么offer是支持定时的,如果队列已满,那么 put是堵塞的。offer将会返回false,add将会异常。

take ,poll和remove的区别

如果是堵塞队列,poll是支持定时的,take是可堵塞的,如果队列为空take将会堵塞,poll将会放回null,而remove,则会异常。

peek,element的区别

peek和element都是用于查询头部元素的,唯一不同点就是如果队列头为空,那么element将会异常,而peek将会返回null