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有 ...
随机推荐
- windows的80端口被占用时的处理方法
1.利用jfinal极速开发时,显示异常,80端口被占用. 2.win+R输入cmd打开黑窗口. netstat -ano | findstr 3.发现进程被占用,输入以下指令停止http服务 net ...
- Spring之旅第六篇-事务管理
一.什么是事务 什么是事务(Transaction)?事务是数据库中的概念,是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 有个非常经典的转账问题:A向B转款1000元,A转出成 ...
- ASP.NET Core中使用GraphQL - 第九章 在GraphQL中处理多对多关系
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积
SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...
- 西安活动 | 4月20日「拥抱开源,又见.NET :云时代 • 新契机」
云计算日渐兴起,成为提升企业效率和生产力的最终解决方案,而云时代也为软件开发模式带来了翻天覆地的变化.可以说 .NET Core就是这个时代催生的产物.自2016年 .NET Core 1.0 发布以 ...
- Python 为什么要使用描述符?
学习 Python 这么久了,说起 Python 的优雅之处,能让我脱口而出的, Descriptor(描述符)特性可以排得上号. 描述符 是Python 语言独有的特性,它不仅在应用层使用,在语言的 ...
- IOS多态在项目中的应用
今天我们讲述一个知识点(大家可能遗漏的) 多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个table ...
- Innosetup 设置文件的相对路径
在使用innosetup自动化打包的过程中,如果打包配置文件要随代码一起提交,则需要将打包文件改为相对路径,以便在其它端也可以直接打包,而不需要再次修改文件路径参数. 添加自动化打包文件 1. 添加b ...
- python之循环(增删)内使用list.remove()
dat=['] for item in dat: ': dat.remove(item) print(dat) #按要求是把'0'都删掉的,输出结果是['1', '2', '3', '0'] ?? 首 ...
- 使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。
在新的版本下,使用AndroidStudio编写APICloud模块,已经非常简单了,解决模块未定义,最重要的就是要先看官方的视频! 注意在模块的module.json中name很重要,建议做到三统一 ...