队列(Queue):与栈相对的一种数据结构 , 集合(Collection)的一个子类 。队列允许在一端进行插入操作 , 而在另一端进行删除操作的线性表 , 栈的特点是后进先出 , 而队列的特点是先进先出 。队列的用处很大 , 比如实现消息队列 。Queue 类关系图 , 如下图所示:
注:为了让读者更直观地理解 , 上图为精简版的 Queue 类关系图 。本文如无特殊说明 , 内容都是基于 Java 1.8 版本 。
队列(Queue)1)Queue 分类从上图可以看出 Queue 大体可分为以下三类 。
- 双端队列:双端队列(Deque)是 Queue 的子类也是 Queue 的补充类 , 头部和尾部都支持元素插入和获取 。
- 阻塞队列:阻塞队列指的是在元素操作时(添加或删除) , 如果没有成功 , 会阻塞等待执行 。例如 , 当添加元素时 , 如果队列元素已满 , 队列会阻塞等待直到有空位时再插入 。
- 非阻塞队列:非阻塞队列和阻塞队列相反 , 会直接返回操作的结果 , 而非阻塞等待 。双端队列也属于非阻塞队列 。
方法说明:
- add(E):添加元素到队列尾部 , 成功返回 true , 队列超出时抛出异常;
- offer(E):添加元素到队列尾部 , 成功返回 true , 队列超出时返回 false;
- remove():删除元素 , 成功返回 true , 失败返回 false;
- poll():获取并移除此队列的第一个元素 , 若队列为空 , 则返回 null;
- peek():获取但不移除此队列的第一个元素 , 若队列为空 , 则返回 null;
- element():获取但不移除此队列的第一个元素 , 若队列为空 , 则抛异常 。
Queue<String> linkedList = new LinkedList<>();linkedList.add("Dog");linkedList.add("Camel");linkedList.add("Cat");while (!linkedList.isEmpty()) {System.out.println(linkedList.poll());}
程序执行结果:Dog阻塞队列1)BlockingQueueBlockingQueue 在 java.util.concurrent 包下 , 其他阻塞类都实现自 BlockingQueue 接口 , BlockingQueue 提供了线程安全的队列访问方式 , 当向队列中插入数据时 , 如果队列已满 , 线程则会阻塞等待队列中元素被取出后再插入;当从队列中取数据时 , 如果队列为空 , 则线程会阻塞等待队列中有新元素再获取 。BlockingQueue 核心方法插入方法:
Camel
Cat
- add(E):添加元素到队列尾部 , 成功返回 true , 队列超出时抛出异常;
- offer(E):添加元素到队列尾部 , 成功返回 true , 队列超出时返回 false ;
- put(E):将元素插入到队列的尾部 , 如果该队列已满 , 则一直阻塞 。
- remove(Object):移除指定元素 , 成功返回 true , 失败返回 false;
- poll(): 获取并移除队列的第一个元素 , 如果队列为空 , 则返回 null;
- take():获取并移除队列第一个元素 , 如果没有元素则一直阻塞 。