Java集合框架中的队列--Queue
程序员文章站
2022-06-08 08:09:32
...
Java中的队列
========
最近在看《java核心技术》,在学习到集合框架的队列一处时,发现书中介绍不太详尽,直接从Deque接口(双端队列)及其实现类开始讲起。结合网络上的博文,在此写下自己的理解以加强记忆并记录下学习所得,如有不正欢迎指出。
1. 关系
在java5中新增加了java.util.Queue接口,定义了队列的一些基本操作,他扩展了Collection接口。java6中定义了Deque(双端队列)接口,扩展了Queue接口定义了双端队列的操作。除此以外还分别有BlockingQueue(阻塞队列)接口,AbstractQueue(非阻塞队列)抽象类。
2. Queue接口
其方法定义如下
boolean add(E element);//添加元素,队满时抛出异常
boolean offer(E element);//添加元素,队满时返回false
E remove(); //删除并返回队头元素,队空时抛出异常
E poll(); //删除并返回队头元素,队空时返回null
E element();//返回队头元素但不删除,队空时抛出异常
E peek();//返回队头元素但不删除,队空时返回null
其实现类有LinkedList,PriorityQueue。
LinkedList是一个普通队列,具有入队出队等操作。
PriorityQueue是一个比较标准的队列实现类,之所以说其标准,是因为其保存队列元素不是按其入队顺序,而是按照队列大小对其重新排序,因此出队的元素通常是最小元素。我们称之为优先级队列,学过操作系统的小伙伴应该对优先级队列非常清楚了,这里不做详细介绍。
3. Deque
它扩展了Queue接口,定义了以下方法
void addFirst(E element);//添加元素到队头,队满时抛出异常
void addLast(E element);//添加元素到队尾,队满时抛出异常
boolean offerFirst(E element);//添加元素到队头,队满时返回false
boolean offerLast(E element);//添加元素到队尾,队满时返回false
E removeFirst();//删除并返回队头元素,队空时抛出异常
E removeLast();//删除并返回队尾元素,队空时抛出异常
E pollFirst();//删除并返回队头元素,队空时返回null
E pollLast();//删除并返回队尾元素,队空时返回null
E getFirst();//返回队头元素但不删除,队空时抛出异常
E getLast();//返回队尾元素但不删除,队空时抛出异常
E peekFirst();//返回队头元素但不删除,队空时返回null
E peekLast();//返回队尾元素但不删除,队空时返回null
其实现类有ArayDeque和LinkedList
这两个实现类都实现了双端队列的功能,同时ArrayDeque也可以当作一个普通队列来使用,这里不做详细介绍。值得注意的是LinkedList实现类,他也实现了Queue,这样怎么区分呢?这就要由变量的声名来区分开了,如下:
Queue<String> queue=new LinkedList<>();
Deque<String> deque=new LinkedList<>();
deque.getFirst();//queue调用此方法报错,方法不存在
看到这里我想读者应该明白两者的区别了,可以自行尝试。此外LinkedList也是List的实现类,区别方法类似。
4. BlockingQueue
以上几个队列不是线程安全的。此接口定义了一个阻塞队列,以实现线程安全的队列,此接口在此不做详细介绍。
其实现类有
DelayQueue
SyncHronousQueue
PriorityBlockingQueue
LinkedBlockingQueue
ArrayBlockQueue
6. AbstractQueue
AbstractQueue是一个非阻塞队列,继承于AbstractCollection,实现了Queue接口,是一个抽象类,它的add()、remove()、element()是基于offer()、poll()、peek()来实现的。
其方法如下
boolean add(E e);
E remove();
E element();
void clear();//clear方法一直调用poll
boolean addAll(Collection<? extends E> c);
此文主要梳理了队列下的继承关系及接口方法、实现类,为个人学习所得,如有不正欢迎指出。
下一篇: 众数问题