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

继承类图

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

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

Iterable接口

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

  1. public interface Iterable<T> {
  2. Iterator<T> iterator();
  3.  
  4. default void forEach(Consumer<? super T> action) {
  5. Objects.requireNonNull(action);
  6. for (T t : this) {
  7. action.accept(t);
  8. }
  9. }
  10.  
  11. default Spliterator<T> spliterator() {
  12. return Spliterators.spliteratorUnknownSize(iterator(), 0);
  13. }
  14. }

Queue接口

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

  1. public interface Queue<E> extends Collection<E> {
  2.  
  3. //插入元素到队尾,成功返回true,失败返回false,空间不足抛出异常
  4. boolean add(E e);
  5.  
  6. //插入元素到队尾,成功返回true,失败返回false
  7. boolean offer(E e);
  8.  
  9. //移除并返回队头元素,如果队列为空,抛出异常
  10. E remove();
  11.  
  12. //移除并返回队头元素,如果队列为空,则返回null
  13. E poll();
  14.  
  15. //返回队头元素,如果队列为空,则抛出异常
  16. E element();
  17.  
  18. //返回队头元素,如果队列为空,则返回null
  19. E peek();
  20. }

Deque接口

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

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

  1. public interface Deque<E> extends Queue<E> {
  2. /**
  3. * 在队头插入元素,如果队列对容量有限制,则容量不足时抛出异常
  4. * IllegalStatException
  5. */
  6. void addFirst(E e);
  7.  
  8. /**
  9. * 在队尾插入元素,如果队列对容量有限制,则容量不足时抛出异常
  10. * IllegalStatException
  11. */
  12. void addLast(E e);
  13.  
  14. /**
  15. * 在队头插入元素,插入成功返回true,失败返回false
  16. * 如果队列对容量有限制,则最好使用该方法
  17. */
  18. boolean offerFirst(E e);
  19.  
  20. /**
  21. * 在队尾插入元素,成功返回true,失败返回false;
  22. * 如果队列对容量有限制,则最好使用该方法
  23. */
  24. boolean offerLast(E e);
  25.  
  26. /**
  27. * 返回并移除队头的元素,如果队列为空,则抛出异常
  28. */
  29. E removeFirst();
  30.  
  31. /**
  32. * 返回并移除队尾的元素,如果队列为空,则抛出异常
  33. */
  34. E removeLast();
  35.  
  36. /**
  37. * 返回并移除队头的元素,如果队列为空,则返回null
  38. */
  39. E pollFirst();
  40.  
  41. /**
  42. * 返回并移除队尾的元素,如果队列为空,则返回null
  43. */
  44. E pollLast();
  45.  
  46. /**
  47. * 返回队头的元素,如果队列为空,则抛出异常NoSuchElementException
  48. */
  49. E getFirst();
  50.  
  51. /**
  52. * 返回队尾的元素,如果队列为空,则抛出异常NoSuchElementException
  53. */
  54. E getLast();
  55.  
  56. /**
  57. * 返回队头的元素,如果队列为空,则返回null
  58. */
  59. E peekFirst();
  60.  
  61. /**
  62. * 返回队尾的元素,如果队列为空,则返回null
  63. */
  64. E peekLast();
  65.  
  66. boolean removeFirstOccurrence(Object o);
  67.  
  68. boolean removeLastOccurrence(Object o);
  69.  
  70. // *** Queue methods ***
  71.  
  72. boolean add(E e);
  73.  
  74. boolean offer(E e);
  75.  
  76. E remove();
  77.  
  78. E poll();
  79.  
  80. E element();
  81.  
  82. E peek();
  83.  
  84. // *** Stack methods ***
  85.  
  86. void push(E e);
  87.  
  88. E pop();
  89.  
  90. // *** Collection methods ***
  91.  
  92. boolean remove(Object o);
  93.  
  94. boolean contains(Object o);
  95.  
  96. public int size();
  97.  
  98. Iterator<E> iterator();
  99.  
  100. Iterator<E> descendingIterator();
  101.  
  102. }

BlockingQueue接口

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

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

  1. public interface BlockingQueue<E> extends Queue<E> {
  2.  
  3. boolean add(E e);
  4.  
  5. boolean offer(E e);
  6.  
  7. /**
  8. * 插入元素,如果空间不足,将会阻塞,直到有可用空间
  9. */
  10. void put(E e) throws InterruptedException;
  11.  
  12. /**
  13. * 插入元素,如果容量不足,将会阻塞,直到有可用空间,或者等待超时
  14. */
  15. boolean offer(E e, long timeout, TimeUnit unit)
  16. throws InterruptedException;
  17.  
  18. /**
  19. * 返回并移除队头的元素,如果队列为空,则等待
  20. *
  21. */
  22. E take() throws InterruptedException;
  23.  
  24. /**
  25. * 返回并移除队头的元素,如果队列为空,则阻塞,直到有可用元素,或者等待超时
  26. *
  27. */
  28. E poll(long timeout, TimeUnit unit)
  29. throws InterruptedException;
  30.  
  31. /**
  32. * 返回队列还能存放多少个元素
  33. * 该方法不会被阻塞,直接返回
  34. */
  35. int remainingCapacity();
  36.  
  37. /**
  38. * 删除给定的元素,如果给定的元素在队列存在多个,则只删除第一个
  39. * 成功删除,返回true,否则,返回false
  40. */
  41. boolean remove(Object o);
  42.  
  43. /**
  44. * 队列中是否存在给定的元素,存在返回true,否则返回false
  45. */
  46. public boolean contains(Object o);
  47.  
  48. /**
  49. * 从队列中删除所有元素,并添加到给定的容器c中
  50. * 该方法比循环调用poll方法更高效
  51. */
  52. int drainTo(Collection<? super E> c);
  53.  
  54. /**
  55. * 最多从队列中删除maxElements个元素,并添加到容器c中
  56. */
  57. int drainTo(Collection<? super E> c, int maxElements);
  58. }

BlockingDeque接口

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

  1. public interface BlockingDeque<E> extends BlockingQueue<E>, Deque<E> {
  2. void addFirst(E e);
  3.  
  4. void addLast(E e);
  5.  
  6. boolean offerFirst(E e);
  7.  
  8. boolean offerLast(E e);
  9.  
  10. void putFirst(E e) throws InterruptedException;
  11.  
  12. void putLast(E e) throws InterruptedException;
  13.  
  14. boolean offerFirst(E e, long timeout, TimeUnit unit) throws InterruptedException;
  15.  
  16. boolean offerLast(E e, long timeout, TimeUnit unit) throws InterruptedException;
  17.  
  18. E takeFirst() throws InterruptedException;
  19.  
  20. E takeLast() throws InterruptedException;
  21.  
  22. E pollFirst(long timeout, TimeUnit unit) throws InterruptedException;
  23.  
  24. E pollLast(long timeout, TimeUnit unit) throws InterruptedException;
  25.  
  26. boolean removeFirstOccurrence(Object o);
  27.  
  28. boolean removeLastOccurrence(Object o);
  29.  
  30. // *** BlockingQueue methods ***
  31. boolean add(E e);
  32.  
  33. boolean offer(E e);
  34.  
  35. void put(E e) throws InterruptedException;
  36.  
  37. boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
  38.  
  39. E remove();
  40.  
  41. E poll();
  42.  
  43. E take() throws InterruptedException;
  44.  
  45. E poll(long timeout, TimeUnit unit) throws InterruptedException;
  46.  
  47. E element();
  48.  
  49. E peek();
  50.  
  51. boolean remove(Object o);
  52.  
  53. public boolean contains(Object o);
  54.  
  55. public int size();
  56.  
  57. Iterator<E> iterator();
  58.  
  59. // *** Stack methods ***
  60. void push(E e);
  61. }

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. ArticleRemoveDelDialog【基于AlertDialog的回收删除对话框】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 回收删除对话框,继承AlertDialog. 仿照钉钉的长按弹出的移除置顶对话框. 效果图 代码分析 继承AlertDialog: ...

  2. SpringBoot + Spring Security 学习笔记(四)记住我功能实现

    记住我功能的基本原理 当用户登录发起认证请求时,会通过UsernamePasswordAuthenticationFilter进行用户认证,认证成功之后,SpringSecurity 调用前期配置好的 ...

  3. winform登录功能

    private void btnLogin_Click(object sender, EventArgs e) { string username = txtUserName.Text; string ...

  4. C# T4 模板 数据库实体类生成模板(带注释,娱乐用)

     说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程    1.htt ...

  5. DevOps概述

    Devops概念 转载自 devops实践-开篇感想 DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和 ...

  6. JavaScript学习之自动轮播图片

    定时器 在实现轮播图之前需要首先了解一下JavaScript的定时器 setInterval()和clearInterval() 1.setInterval() 方法可按照指定的周期(以毫秒计)来调用 ...

  7. 通用查询类封装之Mongodb篇

    查询在应用程序中很重要,花样也特别多,不同得业务需求需要不同的查询条件,还要支持and.or ……事实上也确实如此,程序中有N多个查询类,并且很可能其中有多个类查询同一张表,所以特别想弄一个通用的查询 ...

  8. No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android"

    安装完NDK的时候出现了这个错误,网上的办法是下载旧版的NDK,将其中的toolchain复制到新版的NDK中. 但其实不用这么麻烦. 经过对新版NDK的研究,发现NDK的更新记录里有一段话 This ...

  9. Android View的重绘过程之Layout

    博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,测量,布局,绘画现在我们分析布局部分测量部分在上篇文章中已经分析过了.不了解的可以去我的博客里找一 ...

  10. event 和delegate的分别

    突然想起delegate委托是支持+= 和-=操作的,然后研究一下究竟这个是怎么做到的,好模仿一下.一开始以为是+=的运算符重载,但是在类库参考中并没有这个运算符重载,只有!= 和==运算符重载.有点 ...