队列是Java集合中的重要组成部分,具有先进先出的特性,使其具有广泛的应用场景,比如排队等。因此今天就来学习一下Java中的队列。本文的例子使用的Java8环境。

继承类图

学习队列,首先要知道它的类继承体系,知道每种队列都实现了哪些接口,继承了哪些类,这样有助于帮助我们理解。下面是Java8中队列的类继承图。

从继承类图中可以看出,队列主要分两种,一种是非阻塞队列,实现了Queue接口,包括LinkedList,ArrayDeque和PriorityQueue;一种是阻塞队列,实现了BlockingQueue,包括ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue和LinkedBlockingDeque.

Iterable接口

实现了Iterable接口的类就具有了迭代的功能,可以被用于“for-Each”循环语句。该接口具有的方法如下:

public interface Iterable<T> {
Iterator<T> iterator(); default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
} default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}

Queue接口

Queue接口代表着队列,在队头删除元素,队尾插入元素,有着先进先出的特性,下面是接口声明的方法

 public interface Queue<E> extends Collection<E> {

     //插入元素到队尾,成功返回true,失败返回false,空间不足抛出异常
boolean add(E e); //插入元素到队尾,成功返回true,失败返回false
boolean offer(E e); //移除并返回队头元素,如果队列为空,抛出异常
E remove(); //移除并返回队头元素,如果队列为空,则返回null
E poll(); //返回队头元素,如果队列为空,则抛出异常
E element(); //返回队头元素,如果队列为空,则返回null
E peek();
}

Deque接口

Deque是双端队列,是Double End Queue的简称,与Queue只能在队头删除元素,队尾插入元素不同,Deque可以在队列的头尾分别进行插入和删除元素。由于可以在同一端进行插入和

删除元素,因此可以被当做栈来使用。下面是该接口声明的方法:

public interface Deque<E> extends Queue<E> {
/**
* 在队头插入元素,如果队列对容量有限制,则容量不足时抛出异常
* IllegalStatException
*/
void addFirst(E e); /**
* 在队尾插入元素,如果队列对容量有限制,则容量不足时抛出异常
* IllegalStatException
*/
void addLast(E e); /**
* 在队头插入元素,插入成功返回true,失败返回false
* 如果队列对容量有限制,则最好使用该方法
*/
boolean offerFirst(E e); /**
* 在队尾插入元素,成功返回true,失败返回false;
* 如果队列对容量有限制,则最好使用该方法
*/
boolean offerLast(E e); /**
* 返回并移除队头的元素,如果队列为空,则抛出异常
*/
E removeFirst(); /**
* 返回并移除队尾的元素,如果队列为空,则抛出异常
*/
E removeLast(); /**
* 返回并移除队头的元素,如果队列为空,则返回null
*/
E pollFirst(); /**
* 返回并移除队尾的元素,如果队列为空,则返回null
*/
E pollLast(); /**
* 返回队头的元素,如果队列为空,则抛出异常NoSuchElementException
*/
E getFirst(); /**
* 返回队尾的元素,如果队列为空,则抛出异常NoSuchElementException
*/
E getLast(); /**
* 返回队头的元素,如果队列为空,则返回null
*/
E peekFirst(); /**
* 返回队尾的元素,如果队列为空,则返回null
*/
E peekLast(); boolean removeFirstOccurrence(Object o); boolean removeLastOccurrence(Object o); // *** Queue methods *** boolean add(E e); boolean offer(E e); E remove(); E poll(); E element(); E peek(); // *** Stack methods *** void push(E e); E pop(); // *** Collection methods *** boolean remove(Object o); boolean contains(Object o); public int size(); Iterator<E> iterator(); Iterator<E> descendingIterator(); }

BlockingQueue接口

BlockingQueue是java.util.concurrent包提供的接口,表示阻塞队列,与普通队列的区别是:当从队头获取元素时,如果队列为空,则阻塞队列会阻塞,直到有可用元素、等待超时或者被中断;

当需要在队尾插入元素时,如果队列没有可用的空间,则操作会阻塞,直到有可用空间、等待超时或者被中断。下面是该接口声明的方法:

public interface BlockingQueue<E> extends Queue<E> {

    boolean add(E e);

    boolean offer(E e);

    /**
* 插入元素,如果空间不足,将会阻塞,直到有可用空间
*/
void put(E e) throws InterruptedException; /**
* 插入元素,如果容量不足,将会阻塞,直到有可用空间,或者等待超时
*/
boolean offer(E e, long timeout, TimeUnit unit)
throws InterruptedException; /**
* 返回并移除队头的元素,如果队列为空,则等待
*
*/
E take() throws InterruptedException; /**
* 返回并移除队头的元素,如果队列为空,则阻塞,直到有可用元素,或者等待超时
*
*/
E poll(long timeout, TimeUnit unit)
throws InterruptedException; /**
* 返回队列还能存放多少个元素
* 该方法不会被阻塞,直接返回
*/
int remainingCapacity(); /**
* 删除给定的元素,如果给定的元素在队列存在多个,则只删除第一个
* 成功删除,返回true,否则,返回false
*/
boolean remove(Object o); /**
* 队列中是否存在给定的元素,存在返回true,否则返回false
*/
public boolean contains(Object o); /**
* 从队列中删除所有元素,并添加到给定的容器c中
* 该方法比循环调用poll方法更高效
*/
int drainTo(Collection<? super E> c); /**
* 最多从队列中删除maxElements个元素,并添加到容器c中
*/
int drainTo(Collection<? super E> c, int maxElements);
}

BlockingDeque接口

BlockingDeque是双端阻塞队列,可以在队列的头和尾分别进行元素的插入和删除,可以用作阻塞栈,下面是该接口声明的方法:

public interface BlockingDeque<E> extends BlockingQueue<E>, Deque<E> {
void addFirst(E e); void addLast(E e); boolean offerFirst(E e); boolean offerLast(E e); void putFirst(E e) throws InterruptedException; void putLast(E e) throws InterruptedException; boolean offerFirst(E e, long timeout, TimeUnit unit) throws InterruptedException; boolean offerLast(E e, long timeout, TimeUnit unit) throws InterruptedException; E takeFirst() throws InterruptedException; E takeLast() throws InterruptedException; E pollFirst(long timeout, TimeUnit unit) throws InterruptedException; E pollLast(long timeout, TimeUnit unit) throws InterruptedException; boolean removeFirstOccurrence(Object o); boolean removeLastOccurrence(Object o); // *** BlockingQueue methods ***
boolean add(E e); boolean offer(E e); void put(E e) throws InterruptedException; boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException; E remove(); E poll(); E take() throws InterruptedException; E poll(long timeout, TimeUnit unit) throws InterruptedException; E element(); E peek(); boolean remove(Object o); public boolean contains(Object o); public int size(); Iterator<E> iterator(); // *** Stack methods ***
void push(E e);
}

Java队列学习的更多相关文章

  1. Java队列学习第一篇之列介绍

    Java并发之显式锁和隐式锁的区别 在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchr ...

  2. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  3. Java编程学习知识点分享 入门必看

    Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...

  4. Wmyskxz文章目录导航附Java精品学习资料

    前言:这段时间一直在准备校招的东西,所以一晃眼都好长时间没更新了,这段时间准备的稍微好那么一点点,还是觉得准备归准备,该有的学习节奏还是要有..趁着复习的空隙来整理整理自己写过的文章吧..好多加了微信 ...

  5. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  6. 这月薪过万的Java高级学习资料,难得一遇的干货,不下载真可惜了!

    大家有没有想我呢 不管你们想不想我 我挺想你们的 通过昨天我不断的 死气白咧各种说好话 最终 要到了Java学科的Java集合学习资料 里面包含视频+资料+源码 堂兄也有一个愿望 希望你们月薪过万后 ...

  7. JAVA体系学习-导向

    一:当前学习内容 数值类型处理总结,字符类型处理总结,日期类型处理总结 spring 事务源码分析 spring源码系列 二:当前学习 主攻:并发编程->RPC原理->MQ原理->- ...

  8. java后端学习记录2019

    学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...

  9. 2019/3/2周末 java集合学习(一)

    Java集合学习(一) ArraysList ArraysList集合就像C++中的vector容器,它可以不考虑其容器的长度,就像一个大染缸一 样,无穷无尽的丢进去也没问题.Java的数据结构和C有 ...

随机推荐

  1. Unity 虚拟摇杆的实现

    一般地,虚拟摇杆是放在UI层的. 所以先在Canvas建立一个空对象(这里被命名成MoveController),再在空对象里面放一个作为摇杆图片的Image. 然后通过覆盖重写UnityEngine ...

  2. javascript小记一则:今天在写VS2005——.NET程序时,写的一个JS图片示例案例

    源码如下,如遇调试问题,可以找我解决: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

  3. IOC之Unity的使用详解

    原文链接:https://www.cnblogs.com/hua66/p/9670639.html Unity作为Microsoft推出IOC容器,其功能是非常丰富的,其中需要注意的地方也不少.以下是 ...

  4. 升级SCCM 2012R2 SP1故障解决

    故障一: 上周7月5号进行升级sccm至2012 R2 SP1的操作,执行升级程序splash.hta,在最后核心程序安装步骤失败,关闭升级程序,打开SCCM控制台报错如下: Configuratio ...

  5. kotlin 第一个Android项目

    一.创建过程 二.TextView点击事件 class MainActivity : AppCompatActivity() { lateinit var tv:TextView; //初始化Text ...

  6. Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and recon

    数据库默认模式是主键不可进行修改操作,所以需要运行以下语句. SET SQL_SAFE_UPDATES = 0;  -- 出现error1175使用.

  7. Jenkins 配置GitLab插件和Git插件

    本文演示如何在安装完Jenkins之后,配置GitLab插件和Git插件. 1 安装插件 浏览器登录Jenkins Web UI,点击系统管理,再点击管理插件,切换到可选插件,分别搜索GitLab P ...

  8. c# 多线程 --Mutex(互斥锁) 【转】

    互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它. 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数: //创建一个处于未获取状态的互斥锁 Pub ...

  9. AngularJS学习之旅—AngularJS 事件(十四)

    1.AngularJS 事件 ng-click ( 适用标签 :所有,触发事件:单击): ng-dblclick( 适用标签 :所有,触发事件:双击): ng-blur(适用标签 : a,input, ...

  10. js坚持不懈之11:focus()方法

    主要是用于获取焦点,自动把光标放到此组件上面,无须用户再次操作. 示例: <html> <head> <p>1. 长度限制</p> <form n ...