Java队列学习
队列是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队列学习的更多相关文章
- Java队列学习第一篇之列介绍
Java并发之显式锁和隐式锁的区别 在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchr ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Java编程学习知识点分享 入门必看
Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...
- Wmyskxz文章目录导航附Java精品学习资料
前言:这段时间一直在准备校招的东西,所以一晃眼都好长时间没更新了,这段时间准备的稍微好那么一点点,还是觉得准备归准备,该有的学习节奏还是要有..趁着复习的空隙来整理整理自己写过的文章吧..好多加了微信 ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- 这月薪过万的Java高级学习资料,难得一遇的干货,不下载真可惜了!
大家有没有想我呢 不管你们想不想我 我挺想你们的 通过昨天我不断的 死气白咧各种说好话 最终 要到了Java学科的Java集合学习资料 里面包含视频+资料+源码 堂兄也有一个愿望 希望你们月薪过万后 ...
- JAVA体系学习-导向
一:当前学习内容 数值类型处理总结,字符类型处理总结,日期类型处理总结 spring 事务源码分析 spring源码系列 二:当前学习 主攻:并发编程->RPC原理->MQ原理->- ...
- java后端学习记录2019
学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...
- 2019/3/2周末 java集合学习(一)
Java集合学习(一) ArraysList ArraysList集合就像C++中的vector容器,它可以不考虑其容器的长度,就像一个大染缸一 样,无穷无尽的丢进去也没问题.Java的数据结构和C有 ...
随机推荐
- ArticleRemoveDelDialog【基于AlertDialog的回收删除对话框】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 回收删除对话框,继承AlertDialog. 仿照钉钉的长按弹出的移除置顶对话框. 效果图 代码分析 继承AlertDialog: ...
- SpringBoot + Spring Security 学习笔记(四)记住我功能实现
记住我功能的基本原理 当用户登录发起认证请求时,会通过UsernamePasswordAuthenticationFilter进行用户认证,认证成功之后,SpringSecurity 调用前期配置好的 ...
- winform登录功能
private void btnLogin_Click(object sender, EventArgs e) { string username = txtUserName.Text; string ...
- C# T4 模板 数据库实体类生成模板(带注释,娱乐用)
说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程 1.htt ...
- DevOps概述
Devops概念 转载自 devops实践-开篇感想 DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和 ...
- JavaScript学习之自动轮播图片
定时器 在实现轮播图之前需要首先了解一下JavaScript的定时器 setInterval()和clearInterval() 1.setInterval() 方法可按照指定的周期(以毫秒计)来调用 ...
- 通用查询类封装之Mongodb篇
查询在应用程序中很重要,花样也特别多,不同得业务需求需要不同的查询条件,还要支持and.or ……事实上也确实如此,程序中有N多个查询类,并且很可能其中有多个类查询同一张表,所以特别想弄一个通用的查询 ...
- No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android"
安装完NDK的时候出现了这个错误,网上的办法是下载旧版的NDK,将其中的toolchain复制到新版的NDK中. 但其实不用这么麻烦. 经过对新版NDK的研究,发现NDK的更新记录里有一段话 This ...
- Android View的重绘过程之Layout
博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,测量,布局,绘画现在我们分析布局部分测量部分在上篇文章中已经分析过了.不了解的可以去我的博客里找一 ...
- event 和delegate的分别
突然想起delegate委托是支持+= 和-=操作的,然后研究一下究竟这个是怎么做到的,好模仿一下.一开始以为是+=的运算符重载,但是在类库参考中并没有这个运算符重载,只有!= 和==运算符重载.有点 ...